<!DOCTYPE html>
<html lang="zh-CN">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2">
  <meta name="theme-color" content="#222">
  <meta name="generator" content="Hexo 4.2.1">
  <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png">
  <link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32-next.png">
  <link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16-next.png">
  <link rel="mask-icon" href="/images/safari-pinned-tab.svg" color="#222">
  <link rel="stylesheet" href="/css/main.css">
  <link rel="stylesheet" href="/lib/font-awesome/css/all.min.css">
  <link rel="stylesheet" href="/lib/pace/pace-theme-minimal.min.css">
  <script src="/lib/pace/pace.min.js"></script>
  <script id="hexo-configurations">
    var NexT = window.NexT ||
    {};
    var CONFIG = {
      "hostname": "cuiqingcai.com",
      "root": "/",
      "scheme": "Pisces",
      "version": "7.8.0",
      "exturl": false,
      "sidebar":
      {
        "position": "right",
        "width": 360,
        "display": "post",
        "padding": 18,
        "offset": 12,
        "onmobile": false,
        "widgets": [
          {
            "type": "image",
            "name": "阿布云",
            "enable": false,
            "url": "https://www.abuyun.com/http-proxy/introduce.html",
            "src": "https://qiniu.cuiqingcai.com/88au8.jpg",
            "width": "100%"
      },
          {
            "type": "image",
            "name": "天验",
            "enable": true,
            "url": "https://tutorial.lengyue.video/?coupon=12ef4b1a-a3db-11ea-bb37-0242ac130002_cqx_850",
            "src": "https://qiniu.cuiqingcai.com/bco2a.png",
            "width": "100%"
      },
          {
            "type": "image",
            "name": "华为云",
            "enable": false,
            "url": "https://activity.huaweicloud.com/2020_618_promotion/index.html?bpName=5f9f98a29e2c40b780c1793086f29fe2&bindType=1&salesID=wangyubei",
            "src": "https://qiniu.cuiqingcai.com/y42ik.jpg",
            "width": "100%"
      },
          {
            "type": "image",
            "name": "张小鸡",
            "enable": false,
            "url": "http://www.zxiaoji.com/",
            "src": "https://qiniu.cuiqingcai.com/fm72f.png",
            "width": "100%"
      },
          {
            "type": "image",
            "name": "Luminati",
            "src": "https://qiniu.cuiqingcai.com/ikkq9.jpg",
            "url": "https://luminati-china.io/?affiliate=ref_5fbbaaa9647883f5c6f77095",
            "width": "100%",
            "enable": false
      },
          {
            "type": "image",
            "name": "IPIDEA",
            "url": "http://www.ipidea.net/?utm-source=cqc&utm-keyword=?cqc",
            "src": "https://qiniu.cuiqingcai.com/0ywun.png",
            "width": "100%",
            "enable": true
      },
          {
            "type": "tags",
            "name": "标签云",
            "enable": true
      },
          {
            "type": "categories",
            "name": "分类",
            "enable": true
      },
          {
            "type": "friends",
            "name": "友情链接",
            "enable": true
      },
          {
            "type": "hot",
            "name": "猜你喜欢",
            "enable": true
      }]
      },
      "copycode":
      {
        "enable": true,
        "show_result": true,
        "style": "mac"
      },
      "back2top":
      {
        "enable": true,
        "sidebar": false,
        "scrollpercent": true
      },
      "bookmark":
      {
        "enable": false,
        "color": "#222",
        "save": "auto"
      },
      "fancybox": false,
      "mediumzoom": false,
      "lazyload": false,
      "pangu": true,
      "comments":
      {
        "style": "tabs",
        "active": "gitalk",
        "storage": true,
        "lazyload": false,
        "nav": null,
        "activeClass": "gitalk"
      },
      "algolia":
      {
        "hits":
        {
          "per_page": 10
        },
        "labels":
        {
          "input_placeholder": "Search for Posts",
          "hits_empty": "We didn't find any results for the search: ${query}",
          "hits_stats": "${hits} results found in ${time} ms"
        }
      },
      "localsearch":
      {
        "enable": true,
        "trigger": "auto",
        "top_n_per_article": 10,
        "unescape": false,
        "preload": false
      },
      "motion":
      {
        "enable": false,
        "async": false,
        "transition":
        {
          "post_block": "bounceDownIn",
          "post_header": "slideDownIn",
          "post_body": "slideDownIn",
          "coll_header": "slideLeftIn",
          "sidebar": "slideUpIn"
        }
      },
      "path": "search.xml"
    };

  </script>
  <meta name="description" content="大家好，上次我们实验了爬取了糗事百科的段子，那么这次我们来尝试一下爬取百度贴吧的帖子。与上一篇不同的是，这次我们需要用到文件的相关操作。 前言 亲爱的们，教程比较旧了，百度贴吧页面可能改版，可能代码不好使，八成是正则表达式那儿匹配不到了，请更改一下正则，当然最主要的还是帮助大家理解思路。 2016&#x2F;12&#x2F;2 本篇目标 1.对百度贴吧的任意帖子进行抓取 2.指定是否只抓取楼主发帖内容 3.将抓取到的">
  <meta property="og:type" content="article">
  <meta property="og:title" content="Python爬虫实战二之爬取百度贴吧帖子">
  <meta property="og:url" content="https://cuiqingcai.com/993.html">
  <meta property="og:site_name" content="静觅">
  <meta property="og:description" content="大家好，上次我们实验了爬取了糗事百科的段子，那么这次我们来尝试一下爬取百度贴吧的帖子。与上一篇不同的是，这次我们需要用到文件的相关操作。 前言 亲爱的们，教程比较旧了，百度贴吧页面可能改版，可能代码不好使，八成是正则表达式那儿匹配不到了，请更改一下正则，当然最主要的还是帮助大家理解思路。 2016&#x2F;12&#x2F;2 本篇目标 1.对百度贴吧的任意帖子进行抓取 2.指定是否只抓取楼主发帖内容 3.将抓取到的">
  <meta property="og:locale" content="zh_CN">
  <meta property="og:image" content="http://qiniu.cuiqingcai.com/wp-content/uploads/2015/02/20150219162232.jpg">
  <meta property="og:image" content="http://qiniu.cuiqingcai.com/wp-content/uploads/2015/02/20150219235120-e1424361136128.jpg">
  <meta property="og:image" content="http://qiniu.cuiqingcai.com/wp-content/uploads/2015/02/20150220000103.jpg">
  <meta property="og:image" content="http://qiniu.cuiqingcai.com/wp-content/uploads/2015/02/20150220000947.jpg">
  <meta property="og:image" content="http://qiniu.cuiqingcai.com/wp-content/uploads/2015/02/20150220012351.jpg">
  <meta property="article:published_time" content="2015-02-16T17:09:52.000Z">
  <meta property="article:modified_time" content="2021-12-18T13:11:11.541Z">
  <meta property="article:author" content="崔庆才">
  <meta property="article:tag" content="崔庆才">
  <meta property="article:tag" content="静觅">
  <meta property="article:tag" content="PHP">
  <meta property="article:tag" content="Java">
  <meta property="article:tag" content="Python">
  <meta property="article:tag" content="Spider">
  <meta property="article:tag" content="爬虫">
  <meta property="article:tag" content="Web">
  <meta property="article:tag" content="Kubernetes">
  <meta property="article:tag" content="深度学习">
  <meta property="article:tag" content="机器学习">
  <meta property="article:tag" content="数据分析">
  <meta property="article:tag" content="网络">
  <meta property="article:tag" content="IT">
  <meta property="article:tag" content="技术">
  <meta property="article:tag" content="博客">
  <meta name="twitter:card" content="summary">
  <meta name="twitter:image" content="http://qiniu.cuiqingcai.com/wp-content/uploads/2015/02/20150219162232.jpg">
  <link rel="canonical" href="https://cuiqingcai.com/993.html">
  <script id="page-configurations">
    // https://hexo.io/docs/variables.html
    CONFIG.page = {
      sidebar: "",
      isHome: false,
      isPost: true,
      lang: 'zh-CN'
    };

  </script>
  <title>Python爬虫实战二之爬取百度贴吧帖子 | 静觅</title>
  <meta name="google-site-verification" content="p_bIcnvirkFzG2dYKuNDivKD8-STet5W7D-01woA2fc" />
  <noscript>
    <style>
      .use-motion .brand,
      .use-motion .menu-item,
      .sidebar-inner,
      .use-motion .post-block,
      .use-motion .pagination,
      .use-motion .comments,
      .use-motion .post-header,
      .use-motion .post-body,
      .use-motion .collection-header
      {
        opacity: initial;
      }

      .use-motion .site-title,
      .use-motion .site-subtitle
      {
        opacity: initial;
        top: initial;
      }

      .use-motion .logo-line-before i
      {
        left: initial;
      }

      .use-motion .logo-line-after i
      {
        right: initial;
      }

    </style>
  </noscript>
  <link rel="alternate" href="/atom.xml" title="静觅" type="application/atom+xml">
</head>

<body itemscope itemtype="http://schema.org/WebPage">
  <div class="container">
    <div class="headband"></div>
    <header class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner">
        <div class="site-brand-container">
          <div class="site-nav-toggle">
            <div class="toggle" aria-label="切换导航栏">
              <span class="toggle-line toggle-line-first"></span>
              <span class="toggle-line toggle-line-middle"></span>
              <span class="toggle-line toggle-line-last"></span>
            </div>
          </div>
          <div class="site-meta">
            <a href="/" class="brand" rel="start">
              <span class="logo-line-before"><i></i></span>
              <h1 class="site-title">静觅 <span class="site-subtitle"> 崔庆才的个人站点 </span>
              </h1>
              <span class="logo-line-after"><i></i></span>
            </a>
          </div>
          <div class="site-nav-right">
            <div class="toggle popup-trigger">
              <i class="fa fa-search fa-fw fa-lg"></i>
            </div>
          </div>
        </div>
        <nav class="site-nav">
          <ul id="menu" class="main-menu menu">
            <li class="menu-item menu-item-home">
              <a href="/" rel="section">首页</a>
            </li>
            <li class="menu-item menu-item-archives">
              <a href="/archives/" rel="section">文章列表</a>
            </li>
            <li class="menu-item menu-item-tags">
              <a href="/tags/" rel="section">文章标签</a>
            </li>
            <li class="menu-item menu-item-categories">
              <a href="/categories/" rel="section">文章分类</a>
            </li>
            <li class="menu-item menu-item-about">
              <a href="/about/" rel="section">关于博主</a>
            </li>
            <li class="menu-item menu-item-message">
              <a href="/message/" rel="section">给我留言</a>
            </li>
            <li class="menu-item menu-item-search">
              <a role="button" class="popup-trigger">搜索 </a>
            </li>
          </ul>
        </nav>
        <div class="search-pop-overlay">
          <div class="popup search-popup">
            <div class="search-header">
              <span class="search-icon">
                <i class="fa fa-search"></i>
              </span>
              <div class="search-input-container">
                <input autocomplete="off" autocapitalize="off" placeholder="搜索..." spellcheck="false" type="search" class="search-input">
              </div>
              <span class="popup-btn-close">
                <i class="fa fa-times-circle"></i>
              </span>
            </div>
            <div id="search-result">
              <div id="no-result">
                <i class="fa fa-spinner fa-pulse fa-5x fa-fw"></i>
              </div>
            </div>
          </div>
        </div>
      </div>
    </header>
    <div class="back-to-top">
      <i class="fa fa-arrow-up"></i>
      <span>0%</span>
    </div>
    <div class="reading-progress-bar"></div>
    <main class="main">
      <div class="main-inner">
        <div class="content-wrap">
          <div class="content post posts-expand">
            <article itemscope itemtype="http://schema.org/Article" class="post-block single" lang="zh-CN">
              <link itemprop="mainEntityOfPage" href="https://cuiqingcai.com/993.html">
              <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
                <meta itemprop="image" content="/images/avatar.png">
                <meta itemprop="name" content="崔庆才">
                <meta itemprop="description" content="崔庆才的个人站点，记录生活的瞬间，分享学习的心得。">
              </span>
              <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
                <meta itemprop="name" content="静觅">
              </span>
              <header class="post-header">
                <h1 class="post-title" itemprop="name headline"> Python爬虫实战二之爬取百度贴吧帖子 </h1>
                <div class="post-meta">
                  <span class="post-meta-item">
                    <span class="post-meta-item-icon">
                      <i class="far fa-user"></i>
                    </span>
                    <span class="post-meta-item-text">作者</span>
                    <span><a href="/authors/崔庆才" class="author" itemprop="url" rel="index">崔庆才</a></span>
                  </span>
                  <span class="post-meta-item">
                    <span class="post-meta-item-icon">
                      <i class="far fa-calendar"></i>
                    </span>
                    <span class="post-meta-item-text">发表于</span>
                    <time title="创建时间：2015-02-17 01:09:52" itemprop="dateCreated datePublished" datetime="2015-02-17T01:09:52+08:00">2015-02-17</time>
                  </span>
                  <span class="post-meta-item">
                    <span class="post-meta-item-icon">
                      <i class="far fa-folder"></i>
                    </span>
                    <span class="post-meta-item-text">分类于</span>
                    <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                      <a href="/categories/Python/" itemprop="url" rel="index"><span itemprop="name">Python</span></a>
                    </span>
                  </span>
                  <span id="/993.html" class="post-meta-item leancloud_visitors" data-flag-title="Python爬虫实战二之爬取百度贴吧帖子" title="阅读次数">
                    <span class="post-meta-item-icon">
                      <i class="fa fa-eye"></i>
                    </span>
                    <span class="post-meta-item-text">阅读次数：</span>
                    <span class="leancloud-visitors-count"></span>
                  </span>
                  <span class="post-meta-item" title="本文字数">
                    <span class="post-meta-item-icon">
                      <i class="far fa-file-word"></i>
                    </span>
                    <span class="post-meta-item-text">本文字数：</span>
                    <span>10k</span>
                  </span>
                  <span class="post-meta-item" title="阅读时长">
                    <span class="post-meta-item-icon">
                      <i class="far fa-clock"></i>
                    </span>
                    <span class="post-meta-item-text">阅读时长 &asymp;</span>
                    <span>9 分钟</span>
                  </span>
                </div>
              </header>
              <div class="post-body" itemprop="articleBody">
                <div class="advertisements">
                  <div class="item">
                    <a href="http://i0k.cn/4UUsd" target="_blank">
                      <img src="https://qiniu.cuiqingcai.com/dsdhf.jpg">
                    </a>
                  </div>
                </div>
                <p>大家好，上次我们实验了爬取了糗事百科的段子，那么这次我们来尝试一下爬取百度贴吧的帖子。与上一篇不同的是，这次我们需要用到文件的相关操作。</p>
                <h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2>
                <p>亲爱的们，教程比较旧了，百度贴吧页面可能改版，可能代码不好使，八成是正则表达式那儿匹配不到了，请更改一下正则，当然最主要的还是帮助大家理解思路。</p>
                <p>2016/12/2</p>
                <h2 id="本篇目标"><a href="#本篇目标" class="headerlink" title="本篇目标"></a>本篇目标</h2>
                <p>1.对百度贴吧的任意帖子进行抓取 2.指定是否只抓取楼主发帖内容 3.将抓取到的内容分析并保存到文件</p>
                <h2 id="1-URL格式的确定"><a href="#1-URL格式的确定" class="headerlink" title="1.URL格式的确定"></a>1.URL格式的确定</h2>
                <p>首先，我们先观察一下百度贴吧的任意一个帖子。 比如：<a href="http://tieba.baidu.com/p/3138733512?see_lz=1&amp;pn=1" target="_blank" rel="noopener">http://tieba.baidu.com/p/3138733512?see_lz=1&amp;pn=1</a>，这是一个关于NBA50大的盘点，分析一下这个地址。</p>
                <figure class="highlight angelscript">
                  <table>
                    <tr>
                      <td class="gutter">
                        <pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre>
                      </td>
                      <td class="code">
                        <pre><span class="line">http:<span class="comment">//  代表资源传输使用http协议</span></span><br><span class="line">tieba.baidu.com 是百度的二级域名，指向百度贴吧的服务器。</span><br><span class="line">/p/<span class="number">3138733512</span> 是服务器某个资源，即这个帖子的地址定位符</span><br><span class="line">see_lz和pn是该URL的两个参数，分别代表了只看楼主和帖子页码，等于<span class="number">1</span>表示该条件为真</span><br></pre>
                      </td>
                    </tr>
                  </table>
                </figure>
                <p>所以我们可以把URL分为两部分，一部分为基础部分，一部分为参数部分。 例如，上面的URL我们划分基础部分是 <a href="http://tieba.baidu.com/p/3138733512?see_lz=1&amp;pn=1" target="_blank" rel="noopener">http://tieba.baidu.com/p/3138733512</a>，参数部分是 <a href="http://tieba.baidu.com/p/3138733512?see_lz=1&amp;pn=1" target="_blank" rel="noopener">?see_lz=1&amp;pn=1</a></p>
                <h2 id="2-页面的抓取"><a href="#2-页面的抓取" class="headerlink" title="2.页面的抓取"></a>2.页面的抓取</h2>
                <p>熟悉了URL的格式，那就让我们用urllib2库来试着抓取页面内容吧。上一篇糗事百科我们最后改成了面向对象的编码方式，这次我们直接尝试一下，定义一个类名叫BDTB(百度贴吧)，一个初始化方法，一个获取页面的方法。 其中，有些帖子我们想指定给程序是否要只看楼主，所以我们把只看楼主的参数初始化放在类的初始化上，即init方法。另外，获取页面的方法我们需要知道一个参数就是帖子页码，所以这个参数的指定我们放在该方法中。 综上，我们初步构建出基础代码如下：</p>
                <figure class="highlight python">
                  <table>
                    <tr>
                      <td class="gutter">
                        <pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre>
                      </td>
                      <td class="code">
                        <pre><span class="line">__author__ = <span class="string">'CQC'</span></span><br><span class="line"><span class="comment"># -*- coding:utf-8 -*-</span></span><br><span class="line"><span class="keyword">import</span> urllib</span><br><span class="line"><span class="keyword">import</span> urllib2</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"></span><br><span class="line"><span class="comment">#百度贴吧爬虫类</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">BDTB</span>:</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">#初始化，传入基地址，是否只看楼主的参数</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self,baseUrl,seeLZ)</span>:</span></span><br><span class="line">        self.baseURL = baseUrl</span><br><span class="line">        self.seeLZ = <span class="string">'?see_lz='</span>+str(seeLZ)</span><br><span class="line"></span><br><span class="line">    <span class="comment">#传入页码，获取该页帖子的代码</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">getPage</span><span class="params">(self,pageNum)</span>:</span></span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            url = self.baseURL+ self.seeLZ + <span class="string">'&amp;pn='</span> + str(pageNum)</span><br><span class="line">            request = urllib2.Request(url)</span><br><span class="line">            response = urllib2.urlopen(request)</span><br><span class="line">            <span class="keyword">print</span> response.read()</span><br><span class="line">            <span class="keyword">return</span> response</span><br><span class="line">        <span class="keyword">except</span> urllib2.URLError, e:</span><br><span class="line">            <span class="keyword">if</span> hasattr(e,<span class="string">"reason"</span>):</span><br><span class="line">                <span class="keyword">print</span> <span class="string">u"连接百度贴吧失败,错误原因"</span>,e.reason</span><br><span class="line">                <span class="keyword">return</span> <span class="literal">None</span></span><br><span class="line"></span><br><span class="line">baseURL = <span class="string">'http://tieba.baidu.com/p/3138733512'</span></span><br><span class="line">bdtb = BDTB(baseURL,<span class="number">1</span>)</span><br><span class="line">bdtb.getPage(<span class="number">1</span>)</span><br></pre>
                      </td>
                    </tr>
                  </table>
                </figure>
                <p>运行代码，我们可以看到屏幕上打印出了这个帖子第一页楼主发言的所有内容，形式为HTML代码。 <a href="http://qiniu.cuiqingcai.com/wp-content/uploads/2015/02/20150219162232.jpg" target="_blank" rel="noopener"><img src="http://qiniu.cuiqingcai.com/wp-content/uploads/2015/02/20150219162232.jpg" alt="20150219162232"></a></p>
                <h2 id="3-提取相关信息"><a href="#3-提取相关信息" class="headerlink" title="3.提取相关信息"></a>3.提取相关信息</h2>
                <h3 id="1）提取帖子标题"><a href="#1）提取帖子标题" class="headerlink" title="1）提取帖子标题"></a>1）提取帖子标题</h3>
                <p>首先，让我们提取帖子的标题。 在浏览器中审查元素，或者按F12，查看页面源代码，我们找到标题所在的代码段，可以发现这个标题的HTML代码是</p>
                <figure class="highlight routeros">
                  <table>
                    <tr>
                      <td class="gutter">
                        <pre><span class="line">1</span><br></pre>
                      </td>
                      <td class="code">
                        <pre><span class="line">&lt;h1 <span class="attribute">class</span>=<span class="string">"core_title_txt  "</span> <span class="attribute">title</span>=<span class="string">"纯原创我心中的NBA2014-2015赛季现役50大"</span> <span class="attribute">style</span>=<span class="string">"width: 396px"</span>&gt;纯原创我心中的NBA2014-2015赛季现役50大&lt;/h1&gt;</span><br></pre>
                      </td>
                    </tr>
                  </table>
                </figure>
                <p>所以我们想提取
                <h1>标签中的内容，同时还要指定这个class确定唯一，因为h1标签实在太多啦。 正则表达式如下</p>
                  <figure class="highlight cpp">
                    <table>
                      <tr>
                        <td class="gutter">
                          <pre><span class="line">1</span><br></pre>
                        </td>
                        <td class="code">
                          <pre><span class="line">&lt;h1 <span class="class"><span class="keyword">class</span>="<span class="title">core_title_txt</span>.*?&gt;(.*?)&lt;/h1&gt;</span></span><br></pre>
                        </td>
                      </tr>
                    </table>
                  </figure>
                  <p>所以，我们增加一个获取页面标题的方法</p>
                  <figure class="highlight routeros">
                    <table>
                      <tr>
                        <td class="gutter">
                          <pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre>
                        </td>
                        <td class="code">
                          <pre><span class="line"><span class="comment">#获取帖子标题</span></span><br><span class="line">def getTitle(self):</span><br><span class="line">   <span class="built_in"> page </span>= self.getPage(1)</span><br><span class="line">    pattern = re.compile(<span class="string">'&lt;h1 class="core_title_txt.*?&gt;(.*?)&lt;/h1&gt;'</span>,re.S)</span><br><span class="line">    result = re.search(pattern,page)</span><br><span class="line">    <span class="keyword">if</span> result:</span><br><span class="line">        #<span class="builtin-name">print</span> result.group(1)  #测试输出</span><br><span class="line">        return result.group(1).strip()</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        return None</span><br></pre>
                        </td>
                      </tr>
                    </table>
                  </figure>
                  <h3 id="2）提取帖子页数"><a href="#2）提取帖子页数" class="headerlink" title="2）提取帖子页数"></a>2）提取帖子页数</h3>
                  <p>同样地，帖子总页数我们也可以通过分析页面中的共?页来获取。所以我们的获取总页数的方法如下</p>
                  <figure class="highlight routeros">
                    <table>
                      <tr>
                        <td class="gutter">
                          <pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre>
                        </td>
                        <td class="code">
                          <pre><span class="line"><span class="comment">#获取帖子一共有多少页</span></span><br><span class="line">def getPageNum(self):</span><br><span class="line">   <span class="built_in"> page </span>= self.getPage(1)</span><br><span class="line">    pattern = re.compile(<span class="string">'&lt;li class="l_reply_num.*?&lt;/span&gt;.*?&lt;span.*?&gt;(.*?)&lt;/span&gt;'</span>,re.S)</span><br><span class="line">    result = re.search(pattern,page)</span><br><span class="line">    <span class="keyword">if</span> result:</span><br><span class="line">        #<span class="builtin-name">print</span> result.group(1)  #测试输出</span><br><span class="line">        return result.group(1).strip()</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        return None</span><br></pre>
                        </td>
                      </tr>
                    </table>
                  </figure>
                  <h3 id="3）提取正文内容"><a href="#3）提取正文内容" class="headerlink" title="3）提取正文内容"></a>3）提取正文内容</h3>
                  <p>审查元素，我们可以看到百度贴吧每一层楼的主要内容都在
                  <div id="post_content_xxxx"></div>标签里面，所以我们可以写如下的正则表达式</p>
                  <figure class="highlight applescript">
                    <table>
                      <tr>
                        <td class="gutter">
                          <pre><span class="line">1</span><br></pre>
                        </td>
                        <td class="code">
                          <pre><span class="line">&lt;<span class="keyword">div</span> <span class="built_in">id</span>=<span class="string">"post_content_.*?&gt;(.*?)&lt;/div&gt;</span></span><br></pre>
                        </td>
                      </tr>
                    </table>
                  </figure>
                  <p>相应地，获取页面所有楼层数据的方法可以写成如下方法</p>
                  <figure class="highlight ruby">
                    <table>
                      <tr>
                        <td class="gutter">
                          <pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre>
                        </td>
                        <td class="code">
                          <pre><span class="line"><span class="comment">#获取每一层楼的内容,传入页面内容</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">getContent</span><span class="params">(<span class="keyword">self</span>,page)</span></span><span class="symbol">:</span></span><br><span class="line">    pattern = re.compile(<span class="string">'&lt;div id="post_content_.*?&gt;(.*?)&lt;/div&gt;'</span>,re.S)</span><br><span class="line">    items = re.findall(pattern,page)</span><br><span class="line">    <span class="keyword">for</span> item <span class="keyword">in</span> <span class="symbol">items:</span></span><br><span class="line">        print item</span><br></pre>
                        </td>
                      </tr>
                    </table>
                  </figure>
                  <p>好，我们运行一下结果看一下 <a href="http://qiniu.cuiqingcai.com/wp-content/uploads/2015/02/20150219235120.jpg" target="_blank" rel="noopener"><img src="http://qiniu.cuiqingcai.com/wp-content/uploads/2015/02/20150219235120-e1424361136128.jpg" alt="20150219235120"></a> 真是醉了，还有一大片换行符和图片符，好口怕！既然这样，我们就要对这些文本进行处理，把各种各样复杂的标签给它剔除掉，还原精华内容，把文本处理写成一个方法也可以，不过为了实现更好的代码架构和代码重用，我们可以考虑把标签等的处理写作一个类。 那我们就叫它Tool（工具类吧），里面定义了一个方法，叫replace，是替换各种标签的。在类中定义了几个正则表达式，主要利用了re.sub方法对文本进行匹配后然后替换。具体的思路已经写到注释中，大家可以看一下这个类</p>
                  <figure class="highlight vbnet">
                    <table>
                      <tr>
                        <td class="gutter">
                          <pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre>
                        </td>
                        <td class="code">
                          <pre><span class="line">import re</span><br><span class="line"></span><br><span class="line"><span class="meta">#处理页面标签类</span></span><br><span class="line"><span class="keyword">class</span> Tool:</span><br><span class="line">    <span class="meta">#去除img标签,7位长空格</span></span><br><span class="line">    removeImg = re.compile(<span class="comment">'<span class="doctag">&lt;img.*?&gt;</span>| &#123;7&#125;|')</span></span><br><span class="line">    <span class="meta">#删除超链接标签</span></span><br><span class="line">    removeAddr = re.compile(<span class="comment">'<span class="doctag">&lt;a.*?&gt;</span>|<span class="doctag">&lt;/a&gt;</span>')</span></span><br><span class="line">    <span class="meta">#把换行的标签换为\n</span></span><br><span class="line">    replaceLine = re.compile(<span class="comment">'<span class="doctag">&lt;tr&gt;</span>|<span class="doctag">&lt;div&gt;</span>|<span class="doctag">&lt;/div&gt;</span>|<span class="doctag">&lt;/p&gt;</span>')</span></span><br><span class="line">    <span class="meta">#将表格制表&lt;td&gt;替换为\t</span></span><br><span class="line">    replaceTD= re.compile(<span class="comment">'<span class="doctag">&lt;td&gt;</span>')</span></span><br><span class="line">    <span class="meta">#把段落开头换为\n加空两格</span></span><br><span class="line">    replacePara = re.compile(<span class="comment">'<span class="doctag">&lt;p.*?&gt;</span>')</span></span><br><span class="line">    <span class="meta">#将换行符或双换行符替换为\n</span></span><br><span class="line">    replaceBR = re.compile(<span class="comment">'<span class="doctag">&lt;br&gt;</span><span class="doctag">&lt;br&gt;</span>|<span class="doctag">&lt;br&gt;</span>')</span></span><br><span class="line">    <span class="meta">#将其余标签剔除</span></span><br><span class="line">    removeExtraTag = re.compile(<span class="comment">'<span class="doctag">&lt;.*?&gt;</span>')</span></span><br><span class="line">    def replace(self,x):</span><br><span class="line">        x = re.<span class="keyword">sub</span>(self.removeImg,<span class="string">""</span>,x)</span><br><span class="line">        x = re.<span class="keyword">sub</span>(self.removeAddr,<span class="string">""</span>,x)</span><br><span class="line">        x = re.<span class="keyword">sub</span>(self.replaceLine,<span class="string">"\n"</span>,x)</span><br><span class="line">        x = re.<span class="keyword">sub</span>(self.replaceTD,<span class="string">"\t"</span>,x)</span><br><span class="line">        x = re.<span class="keyword">sub</span>(self.replacePara,<span class="string">"\n    "</span>,x)</span><br><span class="line">        x = re.<span class="keyword">sub</span>(self.replaceBR,<span class="string">"\n"</span>,x)</span><br><span class="line">        x = re.<span class="keyword">sub</span>(self.removeExtraTag,<span class="string">""</span>,x)</span><br><span class="line">        <span class="meta">#strip()将前后多余内容删除</span></span><br><span class="line">        <span class="keyword">return</span> x.strip()</span><br></pre>
                        </td>
                      </tr>
                    </table>
                  </figure>
                  <p>在使用时，我们只需要初始化一下这个类，然后调用replace方法即可。 现在整体代码是如下这样子的，现在我的代码是写到这样子的</p>
                  <figure class="highlight ruby">
                    <table>
                      <tr>
                        <td class="gutter">
                          <pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br></pre>
                        </td>
                        <td class="code">
                          <pre><span class="line">__author_<span class="number">_</span> = <span class="string">'CQC'</span></span><br><span class="line"><span class="comment"># -*- coding:utf-8 -*-</span></span><br><span class="line">import urllib</span><br><span class="line">import urllib2</span><br><span class="line">import re</span><br><span class="line"></span><br><span class="line"><span class="comment">#处理页面标签类</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Tool</span>:</span></span><br><span class="line">    <span class="comment">#去除img标签,7位长空格</span></span><br><span class="line">    removeImg = re.compile(<span class="string">'&lt;img.*?&gt;| &#123;7&#125;|'</span>)</span><br><span class="line">    <span class="comment">#删除超链接标签</span></span><br><span class="line">    removeAddr = re.compile(<span class="string">'&lt;a.*?&gt;|&lt;/a&gt;'</span>)</span><br><span class="line">    <span class="comment">#把换行的标签换为\n</span></span><br><span class="line">    replaceLine = re.compile(<span class="string">'&lt;tr&gt;|&lt;div&gt;|&lt;/div&gt;|&lt;/p&gt;'</span>)</span><br><span class="line">    <span class="comment">#将表格制表&lt;td&gt;替换为\t</span></span><br><span class="line">    replaceTD= re.compile(<span class="string">'&lt;td&gt;'</span>)</span><br><span class="line">    <span class="comment">#把段落开头换为\n加空两格</span></span><br><span class="line">    replacePara = re.compile(<span class="string">'&lt;p.*?&gt;'</span>)</span><br><span class="line">    <span class="comment">#将换行符或双换行符替换为\n</span></span><br><span class="line">    replaceBR = re.compile(<span class="string">'&lt;br&gt;&lt;br&gt;|&lt;br&gt;'</span>)</span><br><span class="line">    <span class="comment">#将其余标签剔除</span></span><br><span class="line">    removeExtraTag = re.compile(<span class="string">'&lt;.*?&gt;'</span>)</span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">replace</span><span class="params">(<span class="keyword">self</span>,x)</span></span><span class="symbol">:</span></span><br><span class="line">        x = re.sub(<span class="keyword">self</span>.removeImg,<span class="string">""</span>,x)</span><br><span class="line">        x = re.sub(<span class="keyword">self</span>.removeAddr,<span class="string">""</span>,x)</span><br><span class="line">        x = re.sub(<span class="keyword">self</span>.replaceLine,<span class="string">"\n"</span>,x)</span><br><span class="line">        x = re.sub(<span class="keyword">self</span>.replaceTD,<span class="string">"\t"</span>,x)</span><br><span class="line">        x = re.sub(<span class="keyword">self</span>.replacePara,<span class="string">"\n    "</span>,x)</span><br><span class="line">        x = re.sub(<span class="keyword">self</span>.replaceBR,<span class="string">"\n"</span>,x)</span><br><span class="line">        x = re.sub(<span class="keyword">self</span>.removeExtraTag,<span class="string">""</span>,x)</span><br><span class="line">        <span class="comment">#strip()将前后多余内容删除</span></span><br><span class="line">        <span class="keyword">return</span> x.strip()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">#百度贴吧爬虫类</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">BDTB</span>:</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">#初始化，传入基地址，是否只看楼主的参数</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(<span class="keyword">self</span>,baseUrl,seeLZ)</span></span><span class="symbol">:</span></span><br><span class="line">        <span class="keyword">self</span>.baseURL = baseUrl</span><br><span class="line">        <span class="keyword">self</span>.seeLZ = <span class="string">'?see_lz='</span>+str(seeLZ)</span><br><span class="line">        <span class="keyword">self</span>.tool = Tool()</span><br><span class="line">    <span class="comment">#传入页码，获取该页帖子的代码</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">getPage</span><span class="params">(<span class="keyword">self</span>,pageNum)</span></span><span class="symbol">:</span></span><br><span class="line">        <span class="symbol">try:</span></span><br><span class="line">            url = <span class="keyword">self</span>.baseURL+ <span class="keyword">self</span>.seeLZ + <span class="string">'&amp;pn='</span> + str(pageNum)</span><br><span class="line">            request = urllib2.Request(url)</span><br><span class="line">            response = urllib2.urlopen(request)</span><br><span class="line">            <span class="keyword">return</span> response.read().decode(<span class="string">'utf-8'</span>)</span><br><span class="line">        except urllib2.URLError, <span class="symbol">e:</span></span><br><span class="line">            <span class="keyword">if</span> hasattr(e,<span class="string">"reason"</span>)<span class="symbol">:</span></span><br><span class="line">                print u<span class="string">"连接百度贴吧失败,错误原因"</span>,e.reason</span><br><span class="line">                <span class="keyword">return</span> None</span><br><span class="line"></span><br><span class="line">    <span class="comment">#获取帖子标题</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">getTitle</span><span class="params">(<span class="keyword">self</span>)</span></span><span class="symbol">:</span></span><br><span class="line">        page = <span class="keyword">self</span>.getPage(<span class="number">1</span>)</span><br><span class="line">        pattern = re.compile(<span class="string">'&lt;h1 class="core_title_txt.*?&gt;(.*?)&lt;/h1&gt;'</span>,re.S)</span><br><span class="line">        result = re.search(pattern,page)</span><br><span class="line">        <span class="keyword">if</span> <span class="symbol">result:</span></span><br><span class="line">            <span class="comment">#print result.group(1)  #测试输出</span></span><br><span class="line">            <span class="keyword">return</span> result.group(<span class="number">1</span>).strip()</span><br><span class="line">        <span class="symbol">else:</span></span><br><span class="line">            <span class="keyword">return</span> None</span><br><span class="line"></span><br><span class="line">    <span class="comment">#获取帖子一共有多少页</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">getPageNum</span><span class="params">(<span class="keyword">self</span>)</span></span><span class="symbol">:</span></span><br><span class="line">        page = <span class="keyword">self</span>.getPage(<span class="number">1</span>)</span><br><span class="line">        pattern = re.compile(<span class="string">'&lt;li class="l_reply_num.*?&lt;/span&gt;.*?&lt;span.*?&gt;(.*?)&lt;/span&gt;'</span>,re.S)</span><br><span class="line">        result = re.search(pattern,page)</span><br><span class="line">        <span class="keyword">if</span> <span class="symbol">result:</span></span><br><span class="line">            <span class="comment">#print result.group(1)  #测试输出</span></span><br><span class="line">            <span class="keyword">return</span> result.group(<span class="number">1</span>).strip()</span><br><span class="line">        <span class="symbol">else:</span></span><br><span class="line">            <span class="keyword">return</span> None</span><br><span class="line"></span><br><span class="line">    <span class="comment">#获取每一层楼的内容,传入页面内容</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">getContent</span><span class="params">(<span class="keyword">self</span>,page)</span></span><span class="symbol">:</span></span><br><span class="line">        pattern = re.compile(<span class="string">'&lt;div id="post_content_.*?&gt;(.*?)&lt;/div&gt;'</span>,re.S)</span><br><span class="line">        items = re.findall(pattern,page)</span><br><span class="line">        <span class="comment">#for item in items:</span></span><br><span class="line">        <span class="comment">#  print item</span></span><br><span class="line">        print <span class="keyword">self</span>.tool.replace(items[<span class="number">1</span>])</span><br><span class="line">        </span><br><span class="line"></span><br><span class="line">baseURL = <span class="string">'http://tieba.baidu.com/p/3138733512'</span></span><br><span class="line">bdtb = BDTB(baseURL,<span class="number">1</span>)</span><br><span class="line">bdtb.getContent(bdtb.getPage(<span class="number">1</span>))</span><br></pre>
                        </td>
                      </tr>
                    </table>
                  </figure>
                  <p>我们尝试一下，重新再看一下效果，这下经过处理之后应该就没问题了，是不是感觉好酸爽！ <a href="http://qiniu.cuiqingcai.com/wp-content/uploads/2015/02/20150220000103.jpg" target="_blank" rel="noopener"><img src="http://qiniu.cuiqingcai.com/wp-content/uploads/2015/02/20150220000103.jpg" alt="20150220000103"></a></p>
                  <h3 id="4）替换楼层"><a href="#4）替换楼层" class="headerlink" title="4）替换楼层"></a>4）替换楼层</h3>
                  <p>至于这个问题，我感觉直接提取楼层没什么必要呀，因为只看楼主的话，有些楼层的编号是间隔的，所以我们得到的楼层序号是不连续的，这样我们保存下来也没什么用。 所以可以尝试下面的方法：</p>
                  <blockquote>
                    <p>1.每打印输出一段楼层，写入一行横线来间隔，或者换行符也好。 2.试着重新编一个楼层，按照顺序，设置一个变量，每打印出一个结果变量加一，打印出这个变量当做楼层。</p>
                  </blockquote>
                  <p>这里我们尝试一下吧，看看效果怎样 把getContent方法修改如下</p>
                  <figure class="highlight python">
                    <table>
                      <tr>
                        <td class="gutter">
                          <pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre>
                        </td>
                        <td class="code">
                          <pre><span class="line"><span class="comment">#获取每一层楼的内容,传入页面内容</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">getContent</span><span class="params">(self,page)</span>:</span></span><br><span class="line">    pattern = re.compile(<span class="string">'&lt;div id="post_content_.*?&gt;(.*?)&lt;/div&gt;'</span>,re.S)</span><br><span class="line">    items = re.findall(pattern,page)</span><br><span class="line">    floor = <span class="number">1</span></span><br><span class="line">    <span class="keyword">for</span> item <span class="keyword">in</span> items:</span><br><span class="line">        <span class="keyword">print</span> floor,<span class="string">u"楼------------------------------------------------------------------------------------------------------------------------------------\n"</span></span><br><span class="line">        <span class="keyword">print</span> self.tool.replace(item)</span><br><span class="line">        floor += <span class="number">1</span></span><br></pre>
                        </td>
                      </tr>
                    </table>
                  </figure>
                  <p>运行一下看看效果 <a href="http://qiniu.cuiqingcai.com/wp-content/uploads/2015/02/20150220000947.jpg" target="_blank" rel="noopener"><img src="http://qiniu.cuiqingcai.com/wp-content/uploads/2015/02/20150220000947.jpg" alt="20150220000947"></a> 嘿嘿，效果还不错吧，感觉真酸爽！接下来我们完善一下，然后写入文件</p>
                  <h2 id="4-写入文件"><a href="#4-写入文件" class="headerlink" title="4.写入文件"></a>4.写入文件</h2>
                  <p>最后便是写入文件的过程，过程很简单，就几句话的代码而已，主要是利用了以下两句</p>
                  <blockquote>
                    <p>file = open(“tb.txt”,”w”) file.writelines(obj)</p>
                  </blockquote>
                  <p>这里不再赘述，稍后直接贴上完善之后的代码。</p>
                  <h2 id="5-完善代码"><a href="#5-完善代码" class="headerlink" title="5.完善代码"></a>5.完善代码</h2>
                  <p>现在我们对代码进行优化，重构，在一些地方添加必要的打印信息，整理如下</p>
                  <figure class="highlight python">
                    <table>
                      <tr>
                        <td class="gutter">
                          <pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br></pre>
                        </td>
                        <td class="code">
                          <pre><span class="line">__author__ = <span class="string">'CQC'</span></span><br><span class="line"><span class="comment"># -*- coding:utf-8 -*-</span></span><br><span class="line"><span class="keyword">import</span> urllib</span><br><span class="line"><span class="keyword">import</span> urllib2</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"></span><br><span class="line"><span class="comment">#处理页面标签类</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Tool</span>:</span></span><br><span class="line">    <span class="comment">#去除img标签,7位长空格</span></span><br><span class="line">    removeImg = re.compile(<span class="string">'&lt;img.*?&gt;| &#123;7&#125;|'</span>)</span><br><span class="line">    <span class="comment">#删除超链接标签</span></span><br><span class="line">    removeAddr = re.compile(<span class="string">'&lt;a.*?&gt;|&lt;/a&gt;'</span>)</span><br><span class="line">    <span class="comment">#把换行的标签换为\n</span></span><br><span class="line">    replaceLine = re.compile(<span class="string">'&lt;tr&gt;|&lt;div&gt;|&lt;/div&gt;|&lt;/p&gt;'</span>)</span><br><span class="line">    <span class="comment">#将表格制表&lt;td&gt;替换为\t</span></span><br><span class="line">    replaceTD= re.compile(<span class="string">'&lt;td&gt;'</span>)</span><br><span class="line">    <span class="comment">#把段落开头换为\n加空两格</span></span><br><span class="line">    replacePara = re.compile(<span class="string">'&lt;p.*?&gt;'</span>)</span><br><span class="line">    <span class="comment">#将换行符或双换行符替换为\n</span></span><br><span class="line">    replaceBR = re.compile(<span class="string">'&lt;br&gt;&lt;br&gt;|&lt;br&gt;'</span>)</span><br><span class="line">    <span class="comment">#将其余标签剔除</span></span><br><span class="line">    removeExtraTag = re.compile(<span class="string">'&lt;.*?&gt;'</span>)</span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">replace</span><span class="params">(self,x)</span>:</span></span><br><span class="line">        x = re.sub(self.removeImg,<span class="string">""</span>,x)</span><br><span class="line">        x = re.sub(self.removeAddr,<span class="string">""</span>,x)</span><br><span class="line">        x = re.sub(self.replaceLine,<span class="string">"\n"</span>,x)</span><br><span class="line">        x = re.sub(self.replaceTD,<span class="string">"\t"</span>,x)</span><br><span class="line">        x = re.sub(self.replacePara,<span class="string">"\n    "</span>,x)</span><br><span class="line">        x = re.sub(self.replaceBR,<span class="string">"\n"</span>,x)</span><br><span class="line">        x = re.sub(self.removeExtraTag,<span class="string">""</span>,x)</span><br><span class="line">        <span class="comment">#strip()将前后多余内容删除</span></span><br><span class="line">        <span class="keyword">return</span> x.strip()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">#百度贴吧爬虫类</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">BDTB</span>:</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">#初始化，传入基地址，是否只看楼主的参数</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self,baseUrl,seeLZ,floorTag)</span>:</span></span><br><span class="line">        <span class="comment">#base链接地址</span></span><br><span class="line">        self.baseURL = baseUrl</span><br><span class="line">        <span class="comment">#是否只看楼主</span></span><br><span class="line">        self.seeLZ = <span class="string">'?see_lz='</span>+str(seeLZ)</span><br><span class="line">        <span class="comment">#HTML标签剔除工具类对象</span></span><br><span class="line">        self.tool = Tool()</span><br><span class="line">        <span class="comment">#全局file变量，文件写入操作对象</span></span><br><span class="line">        self.file = <span class="literal">None</span></span><br><span class="line">        <span class="comment">#楼层标号，初始为1</span></span><br><span class="line">        self.floor = <span class="number">1</span></span><br><span class="line">        <span class="comment">#默认的标题，如果没有成功获取到标题的话则会用这个标题</span></span><br><span class="line">        self.defaultTitle = <span class="string">u"百度贴吧"</span></span><br><span class="line">        <span class="comment">#是否写入楼分隔符的标记</span></span><br><span class="line">        self.floorTag = floorTag</span><br><span class="line"></span><br><span class="line">    <span class="comment">#传入页码，获取该页帖子的代码</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">getPage</span><span class="params">(self,pageNum)</span>:</span></span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            <span class="comment">#构建URL</span></span><br><span class="line">            url = self.baseURL+ self.seeLZ + <span class="string">'&amp;pn='</span> + str(pageNum)</span><br><span class="line">            request = urllib2.Request(url)</span><br><span class="line">            response = urllib2.urlopen(request)</span><br><span class="line">            <span class="comment">#返回UTF-8格式编码内容</span></span><br><span class="line">            <span class="keyword">return</span> response.read().decode(<span class="string">'utf-8'</span>)</span><br><span class="line">        <span class="comment">#无法连接，报错</span></span><br><span class="line">        <span class="keyword">except</span> urllib2.URLError, e:</span><br><span class="line">            <span class="keyword">if</span> hasattr(e,<span class="string">"reason"</span>):</span><br><span class="line">                <span class="keyword">print</span> <span class="string">u"连接百度贴吧失败,错误原因"</span>,e.reason</span><br><span class="line">                <span class="keyword">return</span> <span class="literal">None</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">#获取帖子标题</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">getTitle</span><span class="params">(self,page)</span>:</span></span><br><span class="line">        <span class="comment">#得到标题的正则表达式</span></span><br><span class="line">        pattern = re.compile(<span class="string">'&lt;h1 class="core_title_txt.*?&gt;(.*?)&lt;/h1&gt;'</span>,re.S)</span><br><span class="line">        result = re.search(pattern,page)</span><br><span class="line">        <span class="keyword">if</span> result:</span><br><span class="line">            <span class="comment">#如果存在，则返回标题</span></span><br><span class="line">            <span class="keyword">return</span> result.group(<span class="number">1</span>).strip()</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">None</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">#获取帖子一共有多少页</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">getPageNum</span><span class="params">(self,page)</span>:</span></span><br><span class="line">        <span class="comment">#获取帖子页数的正则表达式</span></span><br><span class="line">        pattern = re.compile(<span class="string">'&lt;li class="l_reply_num.*?&lt;/span&gt;.*?&lt;span.*?&gt;(.*?)&lt;/span&gt;'</span>,re.S)</span><br><span class="line">        result = re.search(pattern,page)</span><br><span class="line">        <span class="keyword">if</span> result:</span><br><span class="line">            <span class="keyword">return</span> result.group(<span class="number">1</span>).strip()</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">None</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">#获取每一层楼的内容,传入页面内容</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">getContent</span><span class="params">(self,page)</span>:</span></span><br><span class="line">        <span class="comment">#匹配所有楼层的内容</span></span><br><span class="line">        pattern = re.compile(<span class="string">'&lt;div id="post_content_.*?&gt;(.*?)&lt;/div&gt;'</span>,re.S)</span><br><span class="line">        items = re.findall(pattern,page)</span><br><span class="line">        contents = []</span><br><span class="line">        <span class="keyword">for</span> item <span class="keyword">in</span> items:</span><br><span class="line">            <span class="comment">#将文本进行去除标签处理，同时在前后加入换行符</span></span><br><span class="line">            content = <span class="string">"\n"</span>+self.tool.replace(item)+<span class="string">"\n"</span></span><br><span class="line">            contents.append(content.encode(<span class="string">'utf-8'</span>))</span><br><span class="line">        <span class="keyword">return</span> contents</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">setFileTitle</span><span class="params">(self,title)</span>:</span></span><br><span class="line">        <span class="comment">#如果标题不是为None，即成功获取到标题</span></span><br><span class="line">        <span class="keyword">if</span> title <span class="keyword">is</span> <span class="keyword">not</span> <span class="literal">None</span>:</span><br><span class="line">            self.file = open(title + <span class="string">".txt"</span>,<span class="string">"w+"</span>)</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            self.file = open(self.defaultTitle + <span class="string">".txt"</span>,<span class="string">"w+"</span>)</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">writeData</span><span class="params">(self,contents)</span>:</span></span><br><span class="line">        <span class="comment">#向文件写入每一楼的信息</span></span><br><span class="line">        <span class="keyword">for</span> item <span class="keyword">in</span> contents:</span><br><span class="line">            <span class="keyword">if</span> self.floorTag == <span class="string">'1'</span>:</span><br><span class="line">                <span class="comment">#楼之间的分隔符</span></span><br><span class="line">                floorLine = <span class="string">"\n"</span> + str(self.floor) + <span class="string">u"-----------------------------------------------------------------------------------------\n"</span></span><br><span class="line">                self.file.write(floorLine)</span><br><span class="line">            self.file.write(item)</span><br><span class="line">            self.floor += <span class="number">1</span></span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">start</span><span class="params">(self)</span>:</span></span><br><span class="line">        indexPage = self.getPage(<span class="number">1</span>)</span><br><span class="line">        pageNum = self.getPageNum(indexPage)</span><br><span class="line">        title = self.getTitle(indexPage)</span><br><span class="line">        self.setFileTitle(title)</span><br><span class="line">        <span class="keyword">if</span> pageNum == <span class="literal">None</span>:</span><br><span class="line">            <span class="keyword">print</span> <span class="string">"URL已失效，请重试"</span></span><br><span class="line">            <span class="keyword">return</span></span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            <span class="keyword">print</span> <span class="string">"该帖子共有"</span> + str(pageNum) + <span class="string">"页"</span></span><br><span class="line">            <span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">1</span>,int(pageNum)+<span class="number">1</span>):</span><br><span class="line">                <span class="keyword">print</span> <span class="string">"正在写入第"</span> + str(i) + <span class="string">"页数据"</span></span><br><span class="line">                page = self.getPage(i)</span><br><span class="line">                contents = self.getContent(page)</span><br><span class="line">                self.writeData(contents)</span><br><span class="line">        <span class="comment">#出现写入异常</span></span><br><span class="line">        <span class="keyword">except</span> IOError,e:</span><br><span class="line">            <span class="keyword">print</span> <span class="string">"写入异常，原因"</span> + e.message</span><br><span class="line">        <span class="keyword">finally</span>:</span><br><span class="line">            <span class="keyword">print</span> <span class="string">"写入任务完成"</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">print</span> <span class="string">u"请输入帖子代号"</span></span><br><span class="line">baseURL = <span class="string">'http://tieba.baidu.com/p/'</span> + str(raw_input(<span class="string">u'http://tieba.baidu.com/p/'</span>))</span><br><span class="line">seeLZ = raw_input(<span class="string">"是否只获取楼主发言，是输入1，否输入0\n"</span>)</span><br><span class="line">floorTag = raw_input(<span class="string">"是否写入楼层信息，是输入1，否输入0\n"</span>)</span><br><span class="line">bdtb = BDTB(baseURL,seeLZ,floorTag)</span><br><span class="line">bdtb.start()</span><br></pre>
                        </td>
                      </tr>
                    </table>
                  </figure>
                  <p>现在程序演示如下 <a href="http://qiniu.cuiqingcai.com/wp-content/uploads/2015/02/20150220012351.jpg" target="_blank" rel="noopener"><img src="http://qiniu.cuiqingcai.com/wp-content/uploads/2015/02/20150220012351.jpg" alt="20150220012351"></a> 完成之后，可以查看一下当前目录下多了一个以该帖子命名的txt文件，内容便是帖子的所有数据。 抓贴吧，就是这么简单和任性！</p>
              </div>
              <div class="reward-container">
                <div></div>
                <button onclick="var qr = document.getElementById('qr'); qr.style.display = (qr.style.display === 'none') ? 'block' : 'none';"> 打赏 </button>
                <div id="qr" style="display: none;">
                  <div style="display: inline-block;">
                    <img src="/images/wechatpay.jpg" alt="崔庆才 微信支付">
                    <p>微信支付</p>
                  </div>
                  <div style="display: inline-block;">
                    <img src="/images/alipay.jpg" alt="崔庆才 支付宝">
                    <p>支付宝</p>
                  </div>
                </div>
              </div>
              <footer class="post-footer">
                <div class="post-nav">
                  <div class="post-nav-item">
                    <a href="/990.html" rel="prev" title="Python爬虫实战一之爬取糗事百科段子">
                      <i class="fa fa-chevron-left"></i> Python爬虫实战一之爬取糗事百科段子 </a>
                  </div>
                  <div class="post-nav-item">
                    <a href="/997.html" rel="next" title="Python爬虫实战七之计算大学本学期绩点"> Python爬虫实战七之计算大学本学期绩点 <i class="fa fa-chevron-right"></i>
                    </a>
                  </div>
                </div>
              </footer>
            </article>
          </div>
          <div class="comments" id="gitalk-container"></div>
          <script>
            window.addEventListener('tabs:register', () =>
            {
              let
              {
                activeClass
              } = CONFIG.comments;
              if (CONFIG.comments.storage)
              {
                activeClass = localStorage.getItem('comments_active') || activeClass;
              }
              if (activeClass)
              {
                let activeTab = document.querySelector(`a[href="#comment-${activeClass}"]`);
                if (activeTab)
                {
                  activeTab.click();
                }
              }
            });
            if (CONFIG.comments.storage)
            {
              window.addEventListener('tabs:click', event =>
              {
                if (!event.target.matches('.tabs-comment .tab-content .tab-pane')) return;
                let commentClass = event.target.classList[1];
                localStorage.setItem('comments_active', commentClass);
              });
            }

          </script>
        </div>
        <div class="toggle sidebar-toggle">
          <span class="toggle-line toggle-line-first"></span>
          <span class="toggle-line toggle-line-middle"></span>
          <span class="toggle-line toggle-line-last"></span>
        </div>
        <aside class="sidebar">
          <div class="sidebar-inner">
            <ul class="sidebar-nav motion-element">
              <li class="sidebar-nav-toc"> 文章目录 </li>
              <li class="sidebar-nav-overview"> 站点概览 </li>
            </ul>
            <!--noindex-->
            <div class="post-toc-wrap sidebar-panel">
              <div class="post-toc motion-element">
                <ol class="nav">
                  <li class="nav-item nav-level-2"><a class="nav-link" href="#前言"><span class="nav-number">1.</span> <span class="nav-text">前言</span></a></li>
                  <li class="nav-item nav-level-2"><a class="nav-link" href="#本篇目标"><span class="nav-number">2.</span> <span class="nav-text">本篇目标</span></a></li>
                  <li class="nav-item nav-level-2"><a class="nav-link" href="#1-URL格式的确定"><span class="nav-number">3.</span> <span class="nav-text">1.URL格式的确定</span></a></li>
                  <li class="nav-item nav-level-2"><a class="nav-link" href="#2-页面的抓取"><span class="nav-number">4.</span> <span class="nav-text">2.页面的抓取</span></a></li>
                  <li class="nav-item nav-level-2"><a class="nav-link" href="#3-提取相关信息"><span class="nav-number">5.</span> <span class="nav-text">3.提取相关信息</span></a>
                    <ol class="nav-child">
                      <li class="nav-item nav-level-3"><a class="nav-link" href="#1）提取帖子标题"><span class="nav-number">5.1.</span> <span class="nav-text">1）提取帖子标题</span></a></li>
                    </ol>
                  </li>
                </ol>
                </li>
                <li class="nav-item nav-level-1"><a class="nav-link" href="#"><span class="nav-number"></span> <span class="nav-text">标签中的内容，同时还要指定这个class确定唯一，因为h1标签实在太多啦。 正则表达式如下 1 &lt;h1 class&#x3D;&quot;core_title_txt.*?&gt;(.*?)&lt;&#x2F;h1&gt; 所以，我们增加一个获取页面标题的方法 1 2 3 4 5 6 7 8 9 10 #获取帖子标题 def getTitle(self): page &#x3D; self.getPage(1) pattern &#x3D; re.compile(&#39;&lt;h1 class&#x3D;&quot;core_title_txt.*?&gt;(.*?)&lt;&#x2F;h1&gt;&#39;,re.S) result &#x3D; re.search(pattern,page) if result: #print result.group(1) #测试输出 return result.group(1).strip() else: return None 2）提取帖子页数 同样地，帖子总页数我们也可以通过分析页面中的共?页来获取。所以我们的获取总页数的方法如下 1 2 3 4 5 6 7 8 9 10 #获取帖子一共有多少页 def getPageNum(self): page &#x3D; self.getPage(1) pattern &#x3D; re.compile(&#39;&lt;li class&#x3D;&quot;l_reply_num.*?&lt;&#x2F;span&gt;.*?&lt;span.*?&gt;(.*?)&lt;&#x2F;span&gt;&#39;,re.S) result &#x3D; re.search(pattern,page) if result: #print result.group(1) #测试输出 return result.group(1).strip() else: return None 3）提取正文内容 审查元素，我们可以看到百度贴吧每一层楼的主要内容都在 标签里面，所以我们可以写如下的正则表达式 1 &lt;div id&#x3D;&quot;post_content_.*?&gt;(.*?)&lt;&#x2F;div&gt; 相应地，获取页面所有楼层数据的方法可以写成如下方法 1 2 3 4 5 6 #获取每一层楼的内容,传入页面内容 def getContent(self,page): pattern &#x3D; re.compile(&#39;&lt;div id&#x3D;&quot;post_content_.*?&gt;(.*?)&lt;&#x2F;div&gt;&#39;,re.S) items &#x3D; re.findall(pattern,page) for item in items: print item 好，我们运行一下结果看一下 真是醉了，还有一大片换行符和图片符，好口怕！既然这样，我们就要对这些文本进行处理，把各种各样复杂的标签给它剔除掉，还原精华内容，把文本处理写成一个方法也可以，不过为了实现更好的代码架构和代码重用，我们可以考虑把标签等的处理写作一个类。 那我们就叫它Tool（工具类吧），里面定义了一个方法，叫replace，是替换各种标签的。在类中定义了几个正则表达式，主要利用了re.sub方法对文本进行匹配后然后替换。具体的思路已经写到注释中，大家可以看一下这个类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 import re #处理页面标签类 class Tool: #去除img标签,7位长空格 removeImg &#x3D; re.compile(&#39;&lt;img.*?&gt;| &amp;#123;7&amp;#125;|&#39;) #删除超链接标签 removeAddr &#x3D; re.compile(&#39;&lt;a.*?&gt;|&lt;&#x2F;a&gt;&#39;) #把换行的标签换为\n replaceLine &#x3D; re.compile(&#39;&lt;tr&gt;|&lt;div&gt;|&lt;&#x2F;div&gt;|&lt;&#x2F;p&gt;&#39;) #将表格制表&lt;td&gt;替换为\t replaceTD&#x3D; re.compile(&#39;&lt;td&gt;&#39;) #把段落开头换为\n加空两格 replacePara &#x3D; re.compile(&#39;&lt;p.*?&gt;&#39;) #将换行符或双换行符替换为\n replaceBR &#x3D; re.compile(&#39;&lt;br&gt;&lt;br&gt;|&lt;br&gt;&#39;) #将其余标签剔除 removeExtraTag &#x3D; re.compile(&#39;&lt;.*?&gt;&#39;) def replace(self,x): x &#x3D; re.sub(self.removeImg,&quot;&quot;,x) x &#x3D; re.sub(self.removeAddr,&quot;&quot;,x) x &#x3D; re.sub(self.replaceLine,&quot;\n&quot;,x) x &#x3D; re.sub(self.replaceTD,&quot;\t&quot;,x) x &#x3D; re.sub(self.replacePara,&quot;\n &quot;,x) x &#x3D; re.sub(self.replaceBR,&quot;\n&quot;,x) x &#x3D; re.sub(self.removeExtraTag,&quot;&quot;,x) #strip()将前后多余内容删除 return x.strip() 在使用时，我们只需要初始化一下这个类，然后调用replace方法即可。 现在整体代码是如下这样子的，现在我的代码是写到这样子的 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 __author__ &#x3D; &#39;CQC&#39; # -*- coding:utf-8 -*- import urllib import urllib2 import re #处理页面标签类 class Tool: #去除img标签,7位长空格 removeImg &#x3D; re.compile(&#39;&lt;img.*?&gt;| &amp;#123;7&amp;#125;|&#39;) #删除超链接标签 removeAddr &#x3D; re.compile(&#39;&lt;a.*?&gt;|&lt;&#x2F;a&gt;&#39;) #把换行的标签换为\n replaceLine &#x3D; re.compile(&#39;&lt;tr&gt;|&lt;div&gt;|&lt;&#x2F;div&gt;|&lt;&#x2F;p&gt;&#39;) #将表格制表&lt;td&gt;替换为\t replaceTD&#x3D; re.compile(&#39;&lt;td&gt;&#39;) #把段落开头换为\n加空两格 replacePara &#x3D; re.compile(&#39;&lt;p.*?&gt;&#39;) #将换行符或双换行符替换为\n replaceBR &#x3D; re.compile(&#39;&lt;br&gt;&lt;br&gt;|&lt;br&gt;&#39;) #将其余标签剔除 removeExtraTag &#x3D; re.compile(&#39;&lt;.*?&gt;&#39;) def replace(self,x): x &#x3D; re.sub(self.removeImg,&quot;&quot;,x) x &#x3D; re.sub(self.removeAddr,&quot;&quot;,x) x &#x3D; re.sub(self.replaceLine,&quot;\n&quot;,x) x &#x3D; re.sub(self.replaceTD,&quot;\t&quot;,x) x &#x3D; re.sub(self.replacePara,&quot;\n &quot;,x) x &#x3D; re.sub(self.replaceBR,&quot;\n&quot;,x) x &#x3D; re.sub(self.removeExtraTag,&quot;&quot;,x) #strip()将前后多余内容删除 return x.strip() #百度贴吧爬虫类 class BDTB: #初始化，传入基地址，是否只看楼主的参数 def __init__(self,baseUrl,seeLZ): self.baseURL &#x3D; baseUrl self.seeLZ &#x3D; &#39;?see_lz&#x3D;&#39;+str(seeLZ) self.tool &#x3D; Tool() #传入页码，获取该页帖子的代码 def getPage(self,pageNum): try: url &#x3D; self.baseURL+ self.seeLZ + &#39;&amp;pn&#x3D;&#39; + str(pageNum) request &#x3D; urllib2.Request(url) response &#x3D; urllib2.urlopen(request) return response.read().decode(&#39;utf-8&#39;) except urllib2.URLError, e: if hasattr(e,&quot;reason&quot;): print u&quot;连接百度贴吧失败,错误原因&quot;,e.reason return None #获取帖子标题 def getTitle(self): page &#x3D; self.getPage(1) pattern &#x3D; re.compile(&#39;&lt;h1 class&#x3D;&quot;core_title_txt.*?&gt;(.*?)&lt;&#x2F;h1&gt;&#39;,re.S) result &#x3D; re.search(pattern,page) if result: #print result.group(1) #测试输出 return result.group(1).strip() else: return None #获取帖子一共有多少页 def getPageNum(self): page &#x3D; self.getPage(1) pattern &#x3D; re.compile(&#39;&lt;li class&#x3D;&quot;l_reply_num.*?&lt;&#x2F;span&gt;.*?&lt;span.*?&gt;(.*?)&lt;&#x2F;span&gt;&#39;,re.S) result &#x3D; re.search(pattern,page) if result: #print result.group(1) #测试输出 return result.group(1).strip() else: return None #获取每一层楼的内容,传入页面内容 def getContent(self,page): pattern &#x3D; re.compile(&#39;&lt;div id&#x3D;&quot;post_content_.*?&gt;(.*?)&lt;&#x2F;div&gt;&#39;,re.S) items &#x3D; re.findall(pattern,page) #for item in items: # print item print self.tool.replace(items[1]) baseURL &#x3D; &#39;http:&#x2F;&#x2F;tieba.baidu.com&#x2F;p&#x2F;3138733512&#39; bdtb &#x3D; BDTB(baseURL,1) bdtb.getContent(bdtb.getPage(1)) 我们尝试一下，重新再看一下效果，这下经过处理之后应该就没问题了，是不是感觉好酸爽！ 4）替换楼层 至于这个问题，我感觉直接提取楼层没什么必要呀，因为只看楼主的话，有些楼层的编号是间隔的，所以我们得到的楼层序号是不连续的，这样我们保存下来也没什么用。 所以可以尝试下面的方法： 1.每打印输出一段楼层，写入一行横线来间隔，或者换行符也好。 2.试着重新编一个楼层，按照顺序，设置一个变量，每打印出一个结果变量加一，打印出这个变量当做楼层。 这里我们尝试一下吧，看看效果怎样 把getContent方法修改如下 1 2 3 4 5 6 7 8 9 #获取每一层楼的内容,传入页面内容 def getContent(self,page): pattern &#x3D; re.compile(&#39;&lt;div id&#x3D;&quot;post_content_.*?&gt;(.*?)&lt;&#x2F;div&gt;&#39;,re.S) items &#x3D; re.findall(pattern,page) floor &#x3D; 1 for item in items: print floor,u&quot;楼------------------------------------------------------------------------------------------------------------------------------------\n&quot; print self.tool.replace(item) floor +&#x3D; 1 运行一下看看效果 嘿嘿，效果还不错吧，感觉真酸爽！接下来我们完善一下，然后写入文件 4.写入文件 最后便是写入文件的过程，过程很简单，就几句话的代码而已，主要是利用了以下两句 file &#x3D; open(“tb.txt”,”w”) file.writelines(obj) 这里不再赘述，稍后直接贴上完善之后的代码。 5.完善代码 现在我们对代码进行优化，重构，在一些地方添加必要的打印信息，整理如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 __author__ &#x3D; &#39;CQC&#39; # -*- coding:utf-8 -*- import urllib import urllib2 import re #处理页面标签类 class Tool: #去除img标签,7位长空格 removeImg &#x3D; re.compile(&#39;&lt;img.*?&gt;| &amp;#123;7&amp;#125;|&#39;) #删除超链接标签 removeAddr &#x3D; re.compile(&#39;&lt;a.*?&gt;|&lt;&#x2F;a&gt;&#39;) #把换行的标签换为\n replaceLine &#x3D; re.compile(&#39;&lt;tr&gt;|&lt;div&gt;|&lt;&#x2F;div&gt;|&lt;&#x2F;p&gt;&#39;) #将表格制表&lt;td&gt;替换为\t replaceTD&#x3D; re.compile(&#39;&lt;td&gt;&#39;) #把段落开头换为\n加空两格 replacePara &#x3D; re.compile(&#39;&lt;p.*?&gt;&#39;) #将换行符或双换行符替换为\n replaceBR &#x3D; re.compile(&#39;&lt;br&gt;&lt;br&gt;|&lt;br&gt;&#39;) #将其余标签剔除 removeExtraTag &#x3D; re.compile(&#39;&lt;.*?&gt;&#39;) def replace(self,x): x &#x3D; re.sub(self.removeImg,&quot;&quot;,x) x &#x3D; re.sub(self.removeAddr,&quot;&quot;,x) x &#x3D; re.sub(self.replaceLine,&quot;\n&quot;,x) x &#x3D; re.sub(self.replaceTD,&quot;\t&quot;,x) x &#x3D; re.sub(self.replacePara,&quot;\n &quot;,x) x &#x3D; re.sub(self.replaceBR,&quot;\n&quot;,x) x &#x3D; re.sub(self.removeExtraTag,&quot;&quot;,x) #strip()将前后多余内容删除 return x.strip() #百度贴吧爬虫类 class BDTB: #初始化，传入基地址，是否只看楼主的参数 def __init__(self,baseUrl,seeLZ,floorTag): #base链接地址 self.baseURL &#x3D; baseUrl #是否只看楼主 self.seeLZ &#x3D; &#39;?see_lz&#x3D;&#39;+str(seeLZ) #HTML标签剔除工具类对象 self.tool &#x3D; Tool() #全局file变量，文件写入操作对象 self.file &#x3D; None #楼层标号，初始为1 self.floor &#x3D; 1 #默认的标题，如果没有成功获取到标题的话则会用这个标题 self.defaultTitle &#x3D; u&quot;百度贴吧&quot; #是否写入楼分隔符的标记 self.floorTag &#x3D; floorTag #传入页码，获取该页帖子的代码 def getPage(self,pageNum): try: #构建URL url &#x3D; self.baseURL+ self.seeLZ + &#39;&amp;pn&#x3D;&#39; + str(pageNum) request &#x3D; urllib2.Request(url) response &#x3D; urllib2.urlopen(request) #返回UTF-8格式编码内容 return response.read().decode(&#39;utf-8&#39;) #无法连接，报错 except urllib2.URLError, e: if hasattr(e,&quot;reason&quot;): print u&quot;连接百度贴吧失败,错误原因&quot;,e.reason return None #获取帖子标题 def getTitle(self,page): #得到标题的正则表达式 pattern &#x3D; re.compile(&#39;&lt;h1 class&#x3D;&quot;core_title_txt.*?&gt;(.*?)&lt;&#x2F;h1&gt;&#39;,re.S) result &#x3D; re.search(pattern,page) if result: #如果存在，则返回标题 return result.group(1).strip() else: return None #获取帖子一共有多少页 def getPageNum(self,page): #获取帖子页数的正则表达式 pattern &#x3D; re.compile(&#39;&lt;li class&#x3D;&quot;l_reply_num.*?&lt;&#x2F;span&gt;.*?&lt;span.*?&gt;(.*?)&lt;&#x2F;span&gt;&#39;,re.S) result &#x3D; re.search(pattern,page) if result: return result.group(1).strip() else: return None #获取每一层楼的内容,传入页面内容 def getContent(self,page): #匹配所有楼层的内容 pattern &#x3D; re.compile(&#39;&lt;div id&#x3D;&quot;post_content_.*?&gt;(.*?)&lt;&#x2F;div&gt;&#39;,re.S) items &#x3D; re.findall(pattern,page) contents &#x3D; [] for item in items: #将文本进行去除标签处理，同时在前后加入换行符 content &#x3D; &quot;\n&quot;+self.tool.replace(item)+&quot;\n&quot; contents.append(content.encode(&#39;utf-8&#39;)) return contents def setFileTitle(self,title): #如果标题不是为None，即成功获取到标题 if title is not None: self.file &#x3D; open(title + &quot;.txt&quot;,&quot;w+&quot;) else: self.file &#x3D; open(self.defaultTitle + &quot;.txt&quot;,&quot;w+&quot;) def writeData(self,contents): #向文件写入每一楼的信息 for item in contents: if self.floorTag &#x3D;&#x3D; &#39;1&#39;: #楼之间的分隔符 floorLine &#x3D; &quot;\n&quot; + str(self.floor) + u&quot;-----------------------------------------------------------------------------------------\n&quot; self.file.write(floorLine) self.file.write(item) self.floor +&#x3D; 1 def start(self): indexPage &#x3D; self.getPage(1) pageNum &#x3D; self.getPageNum(indexPage) title &#x3D; self.getTitle(indexPage) self.setFileTitle(title) if pageNum &#x3D;&#x3D; None: print &quot;URL已失效，请重试&quot; return try: print &quot;该帖子共有&quot; + str(pageNum) + &quot;页&quot; for i in range(1,int(pageNum)+1): print &quot;正在写入第&quot; + str(i) + &quot;页数据&quot; page &#x3D; self.getPage(i) contents &#x3D; self.getContent(page) self.writeData(contents) #出现写入异常 except IOError,e: print &quot;写入异常，原因&quot; + e.message finally: print &quot;写入任务完成&quot; print u&quot;请输入帖子代号&quot; baseURL &#x3D; &#39;http:&#x2F;&#x2F;tieba.baidu.com&#x2F;p&#x2F;&#39; + str(raw_input(u&#39;http:&#x2F;&#x2F;tieba.baidu.com&#x2F;p&#x2F;&#39;)) seeLZ &#x3D; raw_input(&quot;是否只获取楼主发言，是输入1，否输入0\n&quot;) floorTag &#x3D; raw_input(&quot;是否写入楼层信息，是输入1，否输入0\n&quot;) bdtb &#x3D; BDTB(baseURL,seeLZ,floorTag) bdtb.start() 现在程序演示如下 完成之后，可以查看一下当前目录下多了一个以该帖子命名的txt文件，内容便是帖子的所有数据。 抓贴吧，就是这么简单和任性！ </span></a>
                  <ol class="nav-child">
                    <li class="nav-item nav-level-3"><a class="nav-link" href="#2）提取帖子页数"><span class="nav-number">0.1.</span> <span class="nav-text">2）提取帖子页数</span></a></li>
                    <li class="nav-item nav-level-3"><a class="nav-link" href="#3）提取正文内容"><span class="nav-number">0.2.</span> <span class="nav-text">3）提取正文内容</span></a></li>
                    <li class="nav-item nav-level-3"><a class="nav-link" href="#4）替换楼层"><span class="nav-number">0.3.</span> <span class="nav-text">4）替换楼层</span></a></li>
                  </ol>
                </li>
                <li class="nav-item nav-level-2"><a class="nav-link" href="#4-写入文件"><span class="nav-number">1.</span> <span class="nav-text">4.写入文件</span></a></li>
                <li class="nav-item nav-level-2"><a class="nav-link" href="#5-完善代码"><span class="nav-number">2.</span> <span class="nav-text">5.完善代码</span></a></li>
                </ol>
              </div>
            </div>
            <!--/noindex-->
            <div class="site-overview-wrap sidebar-panel">
              <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
                <img class="site-author-image" itemprop="image" alt="崔庆才" src="/images/avatar.png">
                <p class="site-author-name" itemprop="name">崔庆才</p>
                <div class="site-description" itemprop="description">崔庆才的个人站点，记录生活的瞬间，分享学习的心得。</div>
              </div>
              <div class="site-state-wrap motion-element">
                <nav class="site-state">
                  <div class="site-state-item site-state-posts">
                    <a href="/archives/">
                      <span class="site-state-item-count">608</span>
                      <span class="site-state-item-name">日志</span>
                    </a>
                  </div>
                  <div class="site-state-item site-state-categories">
                    <a href="/categories/">
                      <span class="site-state-item-count">24</span>
                      <span class="site-state-item-name">分类</span></a>
                  </div>
                  <div class="site-state-item site-state-tags">
                    <a href="/tags/">
                      <span class="site-state-item-count">156</span>
                      <span class="site-state-item-name">标签</span></a>
                  </div>
                </nav>
              </div>
              <div class="links-of-author motion-element">
                <span class="links-of-author-item">
                  <a href="https://github.com/Germey" title="GitHub → https:&#x2F;&#x2F;github.com&#x2F;Germey" rel="noopener" target="_blank"><i class="fab fa-github fa-fw"></i>GitHub</a>
                </span>
                <span class="links-of-author-item">
                  <a href="mailto:cqc@cuiqingcai.com.com" title="邮件 → mailto:cqc@cuiqingcai.com.com" rel="noopener" target="_blank"><i class="fa fa-envelope fa-fw"></i>邮件</a>
                </span>
                <span class="links-of-author-item">
                  <a href="https://weibo.com/cuiqingcai" title="微博 → https:&#x2F;&#x2F;weibo.com&#x2F;cuiqingcai" rel="noopener" target="_blank"><i class="fab fa-weibo fa-fw"></i>微博</a>
                </span>
                <span class="links-of-author-item">
                  <a href="https://www.zhihu.com/people/Germey" title="知乎 → https:&#x2F;&#x2F;www.zhihu.com&#x2F;people&#x2F;Germey" rel="noopener" target="_blank"><i class="fa fa-magic fa-fw"></i>知乎</a>
                </span>
              </div>
            </div>
            <div style=" width: 100%;" class="sidebar-panel sidebar-panel-image sidebar-panel-active">
              <a href="https://tutorial.lengyue.video/?coupon=12ef4b1a-a3db-11ea-bb37-0242ac130002_cqx_850" target="_blank" rel="noopener">
                <img src="https://qiniu.cuiqingcai.com/bco2a.png" style=" width: 100%;">
              </a>
            </div>
            <div style=" width: 100%;" class="sidebar-panel sidebar-panel-image sidebar-panel-active">
              <a href="http://www.ipidea.net/?utm-source=cqc&utm-keyword=?cqc" target="_blank" rel="noopener">
                <img src="https://qiniu.cuiqingcai.com/0ywun.png" style=" width: 100%;">
              </a>
            </div>
            <div class="sidebar-panel sidebar-panel-tags sidebar-panel-active">
              <h4 class="name"> 标签云 </h4>
              <div class="content">
                <a href="/tags/2048/" style="font-size: 10px;">2048</a> <a href="/tags/API/" style="font-size: 10px;">API</a> <a href="/tags/Bootstrap/" style="font-size: 11.25px;">Bootstrap</a> <a href="/tags/CDN/" style="font-size: 10px;">CDN</a> <a href="/tags/CQC/" style="font-size: 10px;">CQC</a> <a href="/tags/CSS/" style="font-size: 10px;">CSS</a> <a href="/tags/CSS-%E5%8F%8D%E7%88%AC%E8%99%AB/" style="font-size: 10px;">CSS 反爬虫</a> <a href="/tags/CV/" style="font-size: 10px;">CV</a> <a href="/tags/Django/" style="font-size: 10px;">Django</a> <a href="/tags/Eclipse/" style="font-size: 11.25px;">Eclipse</a> <a href="/tags/FTP/" style="font-size: 10px;">FTP</a> <a href="/tags/Git/" style="font-size: 10px;">Git</a> <a href="/tags/GitHub/" style="font-size: 13.75px;">GitHub</a> <a href="/tags/HTML5/" style="font-size: 10px;">HTML5</a> <a href="/tags/Hexo/" style="font-size: 10px;">Hexo</a> <a href="/tags/IT/" style="font-size: 10px;">IT</a> <a href="/tags/JSP/" style="font-size: 10px;">JSP</a> <a href="/tags/JavaScript/" style="font-size: 10px;">JavaScript</a> <a href="/tags/K8s/" style="font-size: 10px;">K8s</a> <a href="/tags/LOGO/" style="font-size: 10px;">LOGO</a> <a href="/tags/Linux/" style="font-size: 10px;">Linux</a> <a href="/tags/MIUI/" style="font-size: 10px;">MIUI</a> <a href="/tags/MongoDB/" style="font-size: 10px;">MongoDB</a> <a href="/tags/Mysql/" style="font-size: 10px;">Mysql</a> <a href="/tags/NBA/" style="font-size: 10px;">NBA</a> <a href="/tags/PHP/" style="font-size: 11.25px;">PHP</a> <a href="/tags/PS/" style="font-size: 10px;">PS</a> <a href="/tags/Pathlib/" style="font-size: 10px;">Pathlib</a> <a href="/tags/PhantomJS/" style="font-size: 10px;">PhantomJS</a> <a href="/tags/Python/" style="font-size: 15px;">Python</a> <a href="/tags/Python3/" style="font-size: 12.5px;">Python3</a> <a href="/tags/Pythonic/" style="font-size: 10px;">Pythonic</a> <a href="/tags/QQ/" style="font-size: 10px;">QQ</a> <a href="/tags/Redis/" style="font-size: 10px;">Redis</a> <a href="/tags/SAE/" style="font-size: 10px;">SAE</a> <a href="/tags/SSH/" style="font-size: 10px;">SSH</a> <a href="/tags/SVG/" style="font-size: 10px;">SVG</a> <a href="/tags/Scrapy/" style="font-size: 10px;">Scrapy</a> <a href="/tags/Scrapy-redis/" style="font-size: 10px;">Scrapy-redis</a> <a href="/tags/Scrapy%E5%88%86%E5%B8%83%E5%BC%8F/" style="font-size: 10px;">Scrapy分布式</a> <a href="/tags/Selenium/" style="font-size: 10px;">Selenium</a> <a href="/tags/TKE/" style="font-size: 10px;">TKE</a> <a href="/tags/Ubuntu/" style="font-size: 11.25px;">Ubuntu</a> <a href="/tags/VS-Code/" style="font-size: 10px;">VS Code</a> <a href="/tags/Vs-Code/" style="font-size: 10px;">Vs Code</a> <a href="/tags/Vue/" style="font-size: 11.25px;">Vue</a> <a href="/tags/Webpack/" style="font-size: 10px;">Webpack</a> <a href="/tags/Windows/" style="font-size: 10px;">Windows</a> <a href="/tags/Winpcap/" style="font-size: 10px;">Winpcap</a> <a href="/tags/WordPress/" style="font-size: 13.75px;">WordPress</a> <a href="/tags/Youtube/" style="font-size: 11.25px;">Youtube</a> <a href="/tags/android/" style="font-size: 10px;">android</a> <a href="/tags/ansible/" style="font-size: 10px;">ansible</a> <a href="/tags/cocos2d-x/" style="font-size: 10px;">cocos2d-x</a> <a href="/tags/e6/" style="font-size: 10px;">e6</a> <a href="/tags/fitvids/" style="font-size: 10px;">fitvids</a> <a href="/tags/git/" style="font-size: 11.25px;">git</a> <a href="/tags/json/" style="font-size: 10px;">json</a> <a href="/tags/js%E9%80%86%E5%90%91/" style="font-size: 10px;">js逆向</a> <a href="/tags/kubernetes/" style="font-size: 10px;">kubernetes</a> <a href="/tags/log/" style="font-size: 10px;">log</a> <a href="/tags/logging/" style="font-size: 10px;">logging</a> <a href="/tags/matlab/" style="font-size: 11.25px;">matlab</a> <a href="/tags/python/" style="font-size: 20px;">python</a> <a href="/tags/pytube/" style="font-size: 11.25px;">pytube</a> <a href="/tags/pywin32/" style="font-size: 10px;">pywin32</a> <a href="/tags/style/" style="font-size: 10px;">style</a> <a href="/tags/tomcat/" style="font-size: 10px;">tomcat</a> <a href="/tags/ubuntu/" style="font-size: 10px;">ubuntu</a> <a href="/tags/uwsgi/" style="font-size: 10px;">uwsgi</a> <a href="/tags/vsftpd/" style="font-size: 10px;">vsftpd</a> <a href="/tags/wamp/" style="font-size: 10px;">wamp</a> <a href="/tags/wineQQ/" style="font-size: 10px;">wineQQ</a> <a href="/tags/%E4%B8%83%E7%89%9B/" style="font-size: 11.25px;">七牛</a> <a href="/tags/%E4%B8%8A%E6%B5%B7/" style="font-size: 10px;">上海</a> <a href="/tags/%E4%B8%AA%E4%BA%BA%E7%BD%91%E7%AB%99/" style="font-size: 10px;">个人网站</a> <a href="/tags/%E4%B8%BB%E9%A2%98/" style="font-size: 10px;">主题</a> <a href="/tags/%E4%BA%91%E4%BA%A7%E5%93%81/" style="font-size: 10px;">云产品</a> <a href="/tags/%E4%BA%91%E5%AD%98%E5%82%A8/" style="font-size: 10px;">云存储</a> <a href="/tags/%E4%BA%AC%E4%B8%9C%E4%BA%91/" style="font-size: 10px;">京东云</a> <a href="/tags/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/" style="font-size: 12.5px;">人工智能</a> <a href="/tags/%E4%BB%A3%E7%90%86/" style="font-size: 10px;">代理</a> <a href="/tags/%E4%BB%A3%E7%A0%81/" style="font-size: 10px;">代码</a> <a href="/tags/%E4%BB%A3%E7%A0%81%E5%88%86%E4%BA%AB%E5%9B%BE/" style="font-size: 10px;">代码分享图</a> <a href="/tags/%E4%BC%98%E5%8C%96/" style="font-size: 10px;">优化</a> <a href="/tags/%E4%BD%8D%E8%BF%90%E7%AE%97/" style="font-size: 10px;">位运算</a> <a href="/tags/%E5%85%AC%E4%BC%97%E5%8F%B7/" style="font-size: 10px;">公众号</a> <a href="/tags/%E5%88%86%E4%BA%AB/" style="font-size: 10px;">分享</a> <a href="/tags/%E5%88%86%E5%B8%83%E5%BC%8F/" style="font-size: 10px;">分布式</a> <a href="/tags/%E5%88%9B%E4%B8%9A/" style="font-size: 10px;">创业</a> <a href="/tags/%E5%89%8D%E7%AB%AF/" style="font-size: 12.5px;">前端</a> <a href="/tags/%E5%8D%9A%E5%AE%A2/" style="font-size: 10px;">博客</a> <a href="/tags/%E5%8E%9F%E7%94%9FAPP/" style="font-size: 10px;">原生APP</a> <a href="/tags/%E5%8F%8D%E7%88%AC%E8%99%AB/" style="font-size: 12.5px;">反爬虫</a> <a href="/tags/%E5%91%BD%E4%BB%A4/" style="font-size: 10px;">命令</a> <a href="/tags/%E5%93%8D%E5%BA%94%E5%BC%8F%E5%B8%83%E5%B1%80/" style="font-size: 10px;">响应式布局</a> <a href="/tags/%E5%9E%83%E5%9C%BE%E9%82%AE%E4%BB%B6/" style="font-size: 10px;">垃圾邮件</a> <a href="/tags/%E5%9F%9F%E5%90%8D%E7%BB%91%E5%AE%9A/" style="font-size: 10px;">域名绑定</a> <a href="/tags/%E5%A4%8D%E7%9B%98/" style="font-size: 10px;">复盘</a> <a href="/tags/%E5%A4%A7%E4%BC%97%E7%82%B9%E8%AF%84/" style="font-size: 10px;">大众点评</a> <a href="/tags/%E5%AD%97%E4%BD%93%E5%8F%8D%E7%88%AC%E8%99%AB/" style="font-size: 10px;">字体反爬虫</a> <a href="/tags/%E5%AD%97%E7%AC%A6%E9%97%AE%E9%A2%98/" style="font-size: 10px;">字符问题</a> <a href="/tags/%E5%AD%A6%E4%B9%A0%E6%96%B9%E6%B3%95/" style="font-size: 10px;">学习方法</a> <a href="/tags/%E5%AE%89%E5%8D%93/" style="font-size: 10px;">安卓</a> <a href="/tags/%E5%AE%9E%E7%94%A8/" style="font-size: 10px;">实用</a> <a href="/tags/%E5%B0%81%E9%9D%A2/" style="font-size: 10px;">封面</a> <a href="/tags/%E5%B4%94%E5%BA%86%E6%89%8D/" style="font-size: 18.75px;">崔庆才</a> <a href="/tags/%E5%B7%A5%E5%85%B7/" style="font-size: 12.5px;">工具</a> <a href="/tags/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/" style="font-size: 10px;">开发工具</a> <a href="/tags/%E5%BE%AE%E8%BD%AF/" style="font-size: 10px;">微软</a> <a href="/tags/%E6%80%9D%E8%80%83/" style="font-size: 10px;">思考</a> <a href="/tags/%E6%89%8B%E6%9C%BA%E8%AE%BF%E9%97%AE/" style="font-size: 10px;">手机访问</a> <a href="/tags/%E6%95%99%E7%A8%8B/" style="font-size: 10px;">教程</a> <a href="/tags/%E6%95%99%E8%82%B2/" style="font-size: 10px;">教育</a> <a href="/tags/%E6%96%B0%E4%B9%A6/" style="font-size: 12.5px;">新书</a> <a href="/tags/%E6%96%B9%E6%B3%95%E8%AE%BA/" style="font-size: 10px;">方法论</a> <a href="/tags/%E6%97%85%E6%B8%B8/" style="font-size: 10px;">旅游</a> <a href="/tags/%E6%97%A5%E5%BF%97/" style="font-size: 10px;">日志</a> <a href="/tags/%E6%9A%97%E6%97%B6%E9%97%B4/" style="font-size: 10px;">暗时间</a> <a href="/tags/%E6%9D%9C%E5%85%B0%E7%89%B9/" style="font-size: 11.25px;">杜兰特</a> <a href="/tags/%E6%A1%8C%E9%9D%A2/" style="font-size: 10px;">桌面</a> <a href="/tags/%E6%AD%8C%E5%8D%95/" style="font-size: 10px;">歌单</a> <a href="/tags/%E6%B1%9F%E5%8D%97/" style="font-size: 10px;">江南</a> <a href="/tags/%E6%B8%B8%E6%88%8F/" style="font-size: 10px;">游戏</a> <a href="/tags/%E7%84%A6%E8%99%91/" style="font-size: 10px;">焦虑</a> <a href="/tags/%E7%88%AC%E8%99%AB/" style="font-size: 16.25px;">爬虫</a> <a href="/tags/%E7%88%AC%E8%99%AB%E4%B9%A6%E7%B1%8D/" style="font-size: 11.25px;">爬虫书籍</a> <a href="/tags/%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F/" style="font-size: 10px;">环境变量</a> <a href="/tags/%E7%94%9F%E6%B4%BB%E7%AC%94%E8%AE%B0/" style="font-size: 10px;">生活笔记</a> <a href="/tags/%E7%99%BB%E5%BD%95/" style="font-size: 10px;">登录</a> <a href="/tags/%E7%9F%A5%E4%B9%8E/" style="font-size: 10px;">知乎</a> <a href="/tags/%E7%9F%AD%E4%BF%A1/" style="font-size: 10px;">短信</a> <a href="/tags/%E7%9F%AD%E4%BF%A1%E9%AA%8C%E8%AF%81%E7%A0%81/" style="font-size: 10px;">短信验证码</a> <a href="/tags/%E7%AC%94%E8%AE%B0%E8%BD%AF%E4%BB%B6/" style="font-size: 10px;">笔记软件</a> <a href="/tags/%E7%AF%AE%E7%BD%91/" style="font-size: 10px;">篮网</a> <a href="/tags/%E7%BA%B8%E5%BC%A0/" style="font-size: 10px;">纸张</a> <a href="/tags/%E7%BB%84%E4%BB%B6/" style="font-size: 10px;">组件</a> <a href="/tags/%E7%BD%91%E7%AB%99/" style="font-size: 10px;">网站</a> <a href="/tags/%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB/" style="font-size: 11.25px;">网络爬虫</a> <a href="/tags/%E7%BE%8E%E5%AD%A6/" style="font-size: 10px;">美学</a> <a href="/tags/%E8%82%89%E5%A4%B9%E9%A6%8D/" style="font-size: 10px;">肉夹馍</a> <a href="/tags/%E8%85%BE%E8%AE%AF%E4%BA%91/" style="font-size: 10px;">腾讯云</a> <a href="/tags/%E8%87%AA%E5%BE%8B/" style="font-size: 10px;">自律</a> <a href="/tags/%E8%A5%BF%E5%B0%91%E7%88%B7/" style="font-size: 10px;">西少爷</a> <a href="/tags/%E8%A7%86%E9%A2%91/" style="font-size: 10px;">视频</a> <a href="/tags/%E8%B0%B7%E6%AD%8C%E9%AA%8C%E8%AF%81%E7%A0%81/" style="font-size: 10px;">谷歌验证码</a> <a href="/tags/%E8%BF%90%E8%90%A5/" style="font-size: 10px;">运营</a> <a href="/tags/%E8%BF%9C%E7%A8%8B/" style="font-size: 10px;">远程</a> <a href="/tags/%E9%80%86%E5%90%91/" style="font-size: 10px;">逆向</a> <a href="/tags/%E9%85%8D%E7%BD%AE/" style="font-size: 10px;">配置</a> <a href="/tags/%E9%87%8D%E8%A3%85/" style="font-size: 10px;">重装</a> <a href="/tags/%E9%98%BF%E6%9D%9C/" style="font-size: 10px;">阿杜</a> <a href="/tags/%E9%9D%99%E8%A7%85/" style="font-size: 17.5px;">静觅</a> <a href="/tags/%E9%A2%A0%E8%A6%86/" style="font-size: 10px;">颠覆</a> <a href="/tags/%E9%A3%9E%E4%BF%A1/" style="font-size: 10px;">飞信</a> <a href="/tags/%E9%B8%BF%E8%92%99/" style="font-size: 10px;">鸿蒙</a>
              </div>
              <script>
                const tagsColors = ['#00a67c', '#5cb85c', '#d9534f', '#567e95', '#b37333', '#f4843d', '#15a287']
                const tagsElements = document.querySelectorAll('.sidebar-panel-tags .content a')
                tagsElements.forEach((item) =>
                {
                  item.style.backgroundColor = tagsColors[Math.floor(Math.random() * tagsColors.length)]
                })

              </script>
            </div>
            <div class="sidebar-panel sidebar-panel-categories sidebar-panel-active">
              <h4 class="name"> 分类 </h4>
              <div class="content">
                <ul class="category-list">
                  <li class="category-list-item"><a class="category-list-link" href="/categories/C-C/">C/C++</a><span class="category-list-count">23</span></li>
                  <li class="category-list-item"><a class="category-list-link" href="/categories/HTML/">HTML</a><span class="category-list-count">14</span></li>
                  <li class="category-list-item"><a class="category-list-link" href="/categories/Java/">Java</a><span class="category-list-count">5</span></li>
                  <li class="category-list-item"><a class="category-list-link" href="/categories/JavaScript/">JavaScript</a><span class="category-list-count">26</span></li>
                  <li class="category-list-item"><a class="category-list-link" href="/categories/Linux/">Linux</a><span class="category-list-count">15</span></li>
                  <li class="category-list-item"><a class="category-list-link" href="/categories/Markdown/">Markdown</a><span class="category-list-count">1</span></li>
                  <li class="category-list-item"><a class="category-list-link" href="/categories/Net/">Net</a><span class="category-list-count">4</span></li>
                  <li class="category-list-item"><a class="category-list-link" href="/categories/Other/">Other</a><span class="category-list-count">39</span></li>
                  <li class="category-list-item"><a class="category-list-link" href="/categories/PHP/">PHP</a><span class="category-list-count">27</span></li>
                  <li class="category-list-item"><a class="category-list-link" href="/categories/Paper/">Paper</a><span class="category-list-count">2</span></li>
                  <li class="category-list-item"><a class="category-list-link" href="/categories/Python/">Python</a><span class="category-list-count">261</span></li>
                  <li class="category-list-item"><a class="category-list-link" href="/categories/TypeScript/">TypeScript</a><span class="category-list-count">2</span></li>
                  <li class="category-list-item"><a class="category-list-link" href="/categories/%E4%B8%AA%E4%BA%BA%E5%B1%95%E7%A4%BA/">个人展示</a><span class="category-list-count">1</span></li>
                  <li class="category-list-item"><a class="category-list-link" href="/categories/%E4%B8%AA%E4%BA%BA%E6%97%A5%E8%AE%B0/">个人日记</a><span class="category-list-count">9</span></li>
                  <li class="category-list-item"><a class="category-list-link" href="/categories/%E4%B8%AA%E4%BA%BA%E8%AE%B0%E5%BD%95/">个人记录</a><span class="category-list-count">4</span></li>
                  <li class="category-list-item"><a class="category-list-link" href="/categories/%E4%B8%AA%E4%BA%BA%E9%9A%8F%E7%AC%94/">个人随笔</a><span class="category-list-count">15</span></li>
                  <li class="category-list-item"><a class="category-list-link" href="/categories/%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE/">安装配置</a><span class="category-list-count">59</span></li>
                  <li class="category-list-item"><a class="category-list-link" href="/categories/%E6%8A%80%E6%9C%AF%E6%9D%82%E8%B0%88/">技术杂谈</a><span class="category-list-count">88</span></li>
                  <li class="category-list-item"><a class="category-list-link" href="/categories/%E6%9C%AA%E5%88%86%E7%B1%BB/">未分类</a><span class="category-list-count">1</span></li>
                  <li class="category-list-item"><a class="category-list-link" href="/categories/%E7%94%9F%E6%B4%BB%E7%AC%94%E8%AE%B0/">生活笔记</a><span class="category-list-count">1</span></li>
                  <li class="category-list-item"><a class="category-list-link" href="/categories/%E7%A6%8F%E5%88%A9%E4%B8%93%E5%8C%BA/">福利专区</a><span class="category-list-count">6</span></li>
                  <li class="category-list-item"><a class="category-list-link" href="/categories/%E8%81%8C%E4%BD%8D%E6%8E%A8%E8%8D%90/">职位推荐</a><span class="category-list-count">2</span></li>
                </ul>
              </div>
            </div>
            <div class="sidebar-panel sidebar-panel-friends sidebar-panel-active">
              <h4 class="name"> 友情链接 </h4>
              <ul class="friends">
                <li class="friend">
                  <span class="logo">
                    <img src="https://qiniu.cuiqingcai.com/j2dub.jpg">
                  </span>
                  <span class="link">
                    <a href="https://www.findhao.net/" target="_blank" rel="noopener">FindHao</a>
                  </span>
                </li>
                <li class="friend">
                  <span class="logo">
                    <img src="https://qiniu.cuiqingcai.com/ou6mm.jpg">
                  </span>
                  <span class="link">
                    <a href="https://diygod.me/" target="_blank" rel="noopener">DIYgod</a>
                  </span>
                </li>
                <li class="friend">
                  <span class="logo">
                    <img src="https://qiniu.cuiqingcai.com/6apxu.jpg">
                  </span>
                  <span class="link">
                    <a href="https://www.51dev.com/" target="_blank" rel="noopener">IT技术社区</a>
                  </span>
                </li>
                <li class="friend">
                  <span class="logo">
                    <img src="https://www.jankl.com/img/titleshu.jpg">
                  </span>
                  <span class="link">
                    <a href="https://www.jankl.com/" target="_blank" rel="noopener">liberalist</a>
                  </span>
                </li>
                <li class="friend">
                  <span class="logo">
                    <img src="https://qiniu.cuiqingcai.com/bqlbs.png">
                  </span>
                  <span class="link">
                    <a href="http://www.urselect.com/" target="_blank" rel="noopener">优社电商</a>
                  </span>
                </li>
                <li class="friend">
                  <span class="logo">
                    <img src="https://qiniu.cuiqingcai.com/8s88c.jpg">
                  </span>
                  <span class="link">
                    <a href="https://www.yuanrenxue.com/" target="_blank" rel="noopener">猿人学</a>
                  </span>
                </li>
                <li class="friend">
                  <span class="logo">
                    <img src="https://qiniu.cuiqingcai.com/2wgg5.jpg">
                  </span>
                  <span class="link">
                    <a href="https://www.yunlifang.cn/" target="_blank" rel="noopener">云立方</a>
                  </span>
                </li>
                <li class="friend">
                  <span class="logo">
                    <img src="https://qiniu.cuiqingcai.com/shwr6.png">
                  </span>
                  <span class="link">
                    <a href="http://lanbing510.info/" target="_blank" rel="noopener">冰蓝</a>
                  </span>
                </li>
                <li class="friend">
                  <span class="logo">
                    <img src="https://qiniu.cuiqingcai.com/blvoh.jpg">
                  </span>
                  <span class="link">
                    <a href="https://lengyue.me/" target="_blank" rel="noopener">冷月</a>
                  </span>
                </li>
                <li class="friend">
                  <span class="logo">
                    <img src="http://qianxunclub.com/favicon.png">
                  </span>
                  <span class="link">
                    <a href="http://qianxunclub.com/" target="_blank" rel="noopener">千寻啊千寻</a>
                  </span>
                </li>
                <li class="friend">
                  <span class="logo">
                    <img src="https://qiniu.cuiqingcai.com/0044u.jpg">
                  </span>
                  <span class="link">
                    <a href="http://kodcloud.com/" target="_blank" rel="noopener">可道云</a>
                  </span>
                </li>
                <li class="friend">
                  <span class="logo">
                    <img src="https://qiniu.cuiqingcai.com/ygnpn.jpg">
                  </span>
                  <span class="link">
                    <a href="http://www.kunkundashen.cn/" target="_blank" rel="noopener">坤坤大神</a>
                  </span>
                </li>
                <li class="friend">
                  <span class="logo">
                    <img src="https://qiniu.cuiqingcai.com/22uv1.png">
                  </span>
                  <span class="link">
                    <a href="http://www.cenchong.com/" target="_blank" rel="noopener">岑冲博客</a>
                  </span>
                </li>
                <li class="friend">
                  <span class="logo">
                    <img src="https://qiniu.cuiqingcai.com/ev9kl.png">
                  </span>
                  <span class="link">
                    <a href="http://www.zxiaoji.com/" target="_blank" rel="noopener">张小鸡</a>
                  </span>
                </li>
                <li class="friend">
                  <span class="logo">
                    <img src="https://www.503error.com/favicon.ico">
                  </span>
                  <span class="link">
                    <a href="https://www.503error.com/" target="_blank" rel="noopener">张志明个人博客</a>
                  </span>
                </li>
                <li class="friend">
                  <span class="logo">
                    <img src="https://qiniu.cuiqingcai.com/x714o.jpg">
                  </span>
                  <span class="link">
                    <a href="http://www.hubwiz.com/" target="_blank" rel="noopener">汇智网</a>
                  </span>
                </li>
                <li class="friend">
                  <span class="logo">
                    <img src="https://qiniu.cuiqingcai.com/129d8.png">
                  </span>
                  <span class="link">
                    <a href="https://www.bysocket.com/" target="_blank" rel="noopener">泥瓦匠BYSocket</a>
                  </span>
                </li>
                <li class="friend">
                  <span class="logo">
                    <img src="https://www.xiongge.club/favicon.ico">
                  </span>
                  <span class="link">
                    <a href="https://www.xiongge.club/" target="_blank" rel="noopener">熊哥club</a>
                  </span>
                </li>
                <li class="friend">
                  <span class="logo">
                    <img src="https://qiniu.cuiqingcai.com/3w4fe.png">
                  </span>
                  <span class="link">
                    <a href="https://zerlong.com/" target="_blank" rel="noopener">知语</a>
                  </span>
                </li>
                <li class="friend">
                  <span class="logo">
                    <img src="https://qiniu.cuiqingcai.com/44hxf.png">
                  </span>
                  <span class="link">
                    <a href="http://redstonewill.com/" target="_blank" rel="noopener">红色石头</a>
                  </span>
                </li>
                <li class="friend">
                  <span class="logo">
                    <img src="https://qiniu.cuiqingcai.com/8g1fk.jpg">
                  </span>
                  <span class="link">
                    <a href="http://www.laodong.me/" target="_blank" rel="noopener">老董博客</a>
                  </span>
                </li>
                <li class="friend">
                  <span class="logo">
                    <img src="https://qiniu.cuiqingcai.com/wkaus.jpg">
                  </span>
                  <span class="link">
                    <a href="https://zhaoshuai.me/" target="_blank" rel="noopener">碎念</a>
                  </span>
                </li>
                <li class="friend">
                  <span class="logo">
                    <img src="https://qiniu.cuiqingcai.com/pgo0r.jpg">
                  </span>
                  <span class="link">
                    <a href="https://www.chenwenguan.com/" target="_blank" rel="noopener">陈文管的博客</a>
                  </span>
                </li>
                <li class="friend">
                  <span class="logo">
                    <img src="https://qiniu.cuiqingcai.com/kk82a.jpg">
                  </span>
                  <span class="link">
                    <a href="https://www.lxlinux.net/" target="_blank" rel="noopener">良许Linux教程网</a>
                  </span>
                </li>
                <li class="friend">
                  <span class="logo">
                    <img src="https://qiniu.cuiqingcai.com/lj0t2.jpg">
                  </span>
                  <span class="link">
                    <a href="https://tanqingbo.cn/" target="_blank" rel="noopener">IT码农</a>
                  </span>
                </li>
                <li class="friend">
                  <span class="logo">
                    <img src="https://qiniu.cuiqingcai.com/i8cdr.png">
                  </span>
                  <span class="link">
                    <a href="https://junyiseo.com/" target="_blank" rel="noopener">均益个人博客</a>
                  </span>
                </li>
                <li class="friend">
                  <span class="logo">
                    <img src="https://qiniu.cuiqingcai.com/chwv2.png">
                  </span>
                  <span class="link">
                    <a href="https://brucedone.com/" target="_blank" rel="noopener">大鱼的鱼塘</a>
                  </span>
                </li>
                <li class="friend">
                  <span class="logo">
                    <img src="https://qiniu.cuiqingcai.com/2y43o.png">
                  </span>
                  <span class="link">
                    <a href="http://bbs.nightteam.cn/" target="_blank" rel="noopener">夜幕爬虫安全论坛</a>
                  </span>
                </li>
                <li class="friend">
                  <span class="logo">
                    <img src="https://qiniu.cuiqingcai.com/zvc3w.jpg">
                  </span>
                  <span class="link">
                    <a href="https://www.weishidong.com/" target="_blank" rel="noopener">韦世东的技术专栏</a>
                  </span>
                </li>
                <li class="friend">
                  <span class="logo">
                    <img src="https://qiniu.cuiqingcai.com/ebudy.jpg">
                  </span>
                  <span class="link">
                    <a href="https://chuanjiabing.com/" target="_blank" rel="noopener">穿甲兵技术社区</a>
                  </span>
                </li>
              </ul>
            </div>
          </div>
        </aside>
        <div id="sidebar-dimmer"></div>
      </div>
    </main>
    <footer class="footer">
      <div class="footer-inner">
        <div class="copyright"> &copy; <span itemprop="copyrightYear">2021</span>
          <span class="with-love">
            <i class="fa fa-heart"></i>
          </span>
          <span class="author" itemprop="copyrightHolder">崔庆才丨静觅</span>
          <span class="post-meta-divider">|</span>
          <span class="post-meta-item-icon">
            <i class="fa fa-chart-area"></i>
          </span>
          <span title="站点总字数">2.6m</span>
          <span class="post-meta-divider">|</span>
          <span class="post-meta-item-icon">
            <i class="fa fa-coffee"></i>
          </span>
          <span title="站点阅读时长">39:54</span>
        </div>
        <div class="powered-by">由 <a href="https://hexo.io/" class="theme-link" rel="noopener" target="_blank">Hexo</a> & <a href="https://pisces.theme-next.org/" class="theme-link" rel="noopener" target="_blank">NexT.Pisces</a> 强力驱动 </div>
        <div class="beian"><a href="https://beian.miit.gov.cn/" rel="noopener" target="_blank">京ICP备18015597号-1 </a>
        </div>
        <script>
          (function ()
          {
            function leancloudSelector(url)
            {
              url = encodeURI(url);
              return document.getElementById(url).querySelector('.leancloud-visitors-count');
            }

            function addCount(Counter)
            {
              var visitors = document.querySelector('.leancloud_visitors');
              var url = decodeURI(visitors.id);
              var title = visitors.dataset.flagTitle;
              Counter('get', '/classes/Counter?where=' + encodeURIComponent(JSON.stringify(
              {
                url
              }))).then(response => response.json()).then((
              {
                results
              }) =>
              {
                if (results.length > 0)
                {
                  var counter = results[0];
                  leancloudSelector(url).innerText = counter.time + 1;
                  Counter('put', '/classes/Counter/' + counter.objectId,
                  {
                    time:
                    {
                      '__op': 'Increment',
                      'amount': 1
                    }
                  }).catch(error =>
                  {
                    console.error('Failed to save visitor count', error);
                  });
                }
                else
                {
                  Counter('post', '/classes/Counter',
                  {
                    title,
                    url,
                    time: 1
                  }).then(response => response.json()).then(() =>
                  {
                    leancloudSelector(url).innerText = 1;
                  }).catch(error =>
                  {
                    console.error('Failed to create', error);
                  });
                }
              }).catch(error =>
              {
                console.error('LeanCloud Counter Error', error);
              });
            }

            function showTime(Counter)
            {
              var visitors = document.querySelectorAll('.leancloud_visitors');
              var entries = [...visitors].map(element =>
              {
                return decodeURI(element.id);
              });
              Counter('get', '/classes/Counter?where=' + encodeURIComponent(JSON.stringify(
              {
                url:
                {
                  '$in': entries
                }
              }))).then(response => response.json()).then((
              {
                results
              }) =>
              {
                for (let url of entries)
                {
                  let target = results.find(item => item.url === url);
                  leancloudSelector(url).innerText = target ? target.time : 0;
                }
              }).catch(error =>
              {
                console.error('LeanCloud Counter Error', error);
              });
            }
            let
            {
              app_id,
              app_key,
              server_url
            } = {
              "enable": true,
              "app_id": "6X5dRQ0pnPWJgYy8SXOg0uID-gzGzoHsz",
              "app_key": "ziLDVEy73ne5HtFTiGstzHMS",
              "server_url": "https://6x5drq0p.lc-cn-n1-shared.com",
              "security": false
            };

            function fetchData(api_server)
            {
              var Counter = (method, url, data) =>
              {
                return fetch(`${api_server}/1.1${url}`,
                {
                  method,
                  headers:
                  {
                    'X-LC-Id': app_id,
                    'X-LC-Key': app_key,
                    'Content-Type': 'application/json',
                  },
                  body: JSON.stringify(data)
                });
              };
              if (CONFIG.page.isPost)
              {
                if (CONFIG.hostname !== location.hostname) return;
                addCount(Counter);
              }
              else if (document.querySelectorAll('.post-title-link').length >= 1)
              {
                showTime(Counter);
              }
            }
            let api_server = app_id.slice(-9) !== '-MdYXbMMI' ? server_url : `https://${app_id.slice(0, 8).toLowerCase()}.api.lncldglobal.com`;
            if (api_server)
            {
              fetchData(api_server);
            }
            else
            {
              fetch('https://app-router.leancloud.cn/2/route?appId=' + app_id).then(response => response.json()).then((
              {
                api_server
              }) =>
              {
                fetchData('https://' + api_server);
              });
            }
          })();

        </script>
      </div>
      <div class="footer-stat">
        <span id="cnzz_stat_icon_1279355174"></span>
        <script type="text/javascript">
          document.write(unescape("%3Cspan id='cnzz_stat_icon_1279355174'%3E%3C/span%3E%3Cscript src='https://v1.cnzz.com/z_stat.php%3Fid%3D1279355174%26online%3D1%26show%3Dline' type='text/javascript'%3E%3C/script%3E"));

        </script>
      </div>
    </footer>
  </div>
  <script src="//cdn.jsdelivr.net/npm/animejs@3.2.1/lib/anime.min.js"></script>
  <script src="//cdn.jsdelivr.net/npm/pangu@4/dist/browser/pangu.min.js"></script>
  <script src="/js/utils.js"></script>
  <script src="/.js"></script>
  <script src="/js/schemes/pisces.js"></script>
  <script src="/.js"></script>
  <script src="/js/next-boot.js"></script>
  <script src="/.js"></script>
  <script>
    (function ()
    {
      var canonicalURL, curProtocol;
      //Get the <link> tag
      var x = document.getElementsByTagName("link");
      //Find the last canonical URL
      if (x.length > 0)
      {
        for (i = 0; i < x.length; i++)
        {
          if (x[i].rel.toLowerCase() == 'canonical' && x[i].href)
          {
            canonicalURL = x[i].href;
          }
        }
      }
      //Get protocol
      if (!canonicalURL)
      {
        curProtocol = window.location.protocol.split(':')[0];
      }
      else
      {
        curProtocol = canonicalURL.split(':')[0];
      }
      //Get current URL if the canonical URL does not exist
      if (!canonicalURL) canonicalURL = window.location.href;
      //Assign script content. Replace current URL with the canonical URL
      ! function ()
      {
        var e = /([http|https]:\/\/[a-zA-Z0-9\_\.]+\.baidu\.com)/gi,
          r = canonicalURL,
          t = document.referrer;
        if (!e.test(r))
        {
          var n = (String(curProtocol).toLowerCase() === 'https') ? "https://sp0.baidu.com/9_Q4simg2RQJ8t7jm9iCKT-xh_/s.gif" : "//api.share.baidu.com/s.gif";
          t ? (n += "?r=" + encodeURIComponent(document.referrer), r && (n += "&l=" + r)) : r && (n += "?l=" + r);
          var i = new Image;
          i.src = n
        }
      }(window);
    })();

  </script>
  <script src="/js/local-search.js"></script>
  <script src="/.js"></script>
  <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/gitalk@1/dist/gitalk.min.css">
  <script>
    NexT.utils.loadComments(document.querySelector('#gitalk-container'), () =>
    {
      NexT.utils.getScript('//cdn.jsdelivr.net/npm/gitalk@1/dist/gitalk.min.js', () =>
      {
        var gitalk = new Gitalk(
        {
          clientID: '4c86ce1d7c4fbb3b277c',
          clientSecret: '4927beb0f90e2c07e66c99d9d2529cf3eb8ac8e4',
          repo: 'Blog',
          owner: 'germey',
          admin: ['germey'],
          id: 'd0ff851c3066e8472a5bb34926a4ecf7',
          language: 'zh-CN',
          distractionFreeMode: true
        });
        gitalk.render('gitalk-container');
      }, window.Gitalk);
    });

  </script>
</body>

</html>
